2011-09-05 10 views
8

WPF ItemsSourceをプライベートプロパティにバインドする方法はありますか?ItemsSourceをプライベートプロパティにバインドする方法

<ComboBox x:Name="xxx" ItemsSource="{Binding Items, Mode=OneWay}" 
      DisplayMemberPath="ItemName"/> 
public partial class ItemBuySellAddEdit : BasePage 
{ 
    private List<Item> Items { get; set; } 
} 

アイテムリストは、フォームのロード中に取り込まれます。

+0

パブリック/内部バインディングを使用しています。 – RainCast

答えて

20

WPFでのデータバインディングは、パブリックプロパティでのみ機能します。

MSDN:あなたはバインディングのソースプロパティをバインディングとして使用

プロパティは クラスのパブリックプロパティでなければなりません。明示的に定義されたインタフェース プロパティが結合の目的のためにアクセスすることはできません、また保護することができ、何のベースを持っていない 、民間の内部、または仮想プロパティ 実装

+0

公開しても作れませんでした。 : – sameera

+1

Listの代わりにObservableCollection を使用する

2

あなたがしたい場合、これは、可能ではない、あなたが使用することができます代わりにinternal

... ObservableCollection<T>を使用し、ビューのDataContextを設定することを忘れないでください。

+6

私の経験では、内部アクセシビリティでさえXAMLデータバインディングを破るのに十分であり、パブリックプロパティのみがバインドできます。 – Neutrino

1

相対ソースバインディングが必要です。現在、partialを使用しているため、バインドはItemBuySellAddEdit(FrameworkElement)Atleastの私の印象です。 ViewModelの場合は出力ウィンドウをチェックし、バインディングエラーがあるかどうか調べます。

<ComboBox 
    x:Name="xxx" 
    ItemsSource="{Binding Items, 
     RelativeSource={RelativeSource AncestorType={x:Type ItemBuySellAddEdit}}, 
     Mode=OneWay}" 
    DisplayMemberPath="ItemName"/> 

しかし、ステファン・バウアーからの回答は依然として適用されます。

また、リスト内の新しいアイテムを自動的に表示する場合は、WaltiDの回答を考慮してください。

3

を実装することで、カスタムタイプ記述子を提供する必要がある場合は、通常のパブリックプロパティに沿ってカスタムPropertyDescriptorを介して余分なプロパティを提供します。このインターフェイスは、型自体に実装することも、TypeDescriptionProvider経由で実装することもできます。より多くのシナリオ(空リストのようなもので、ITypedList実装でカスタムリストを提供する必要はありません)で動作するので、後者が好まれます。これは仕事のロットであり、本当には極端な場合を除いて価値がありません。しかし、それを行うことができます。

関連する問題