DataContextとItemsSourceの違い、わかりますか?
MVVMでデータをバインディングするために、しっかりと違いを理解しておきましょう。
DataContextとItemsSourceの違い
DataContext
DataContext は FrameworkElement クラスで定義されていますので、すべてのコントロールに存在します。
これは要素にバインドするデータを表します。
ItemsSource
ItemsSource は ItemsControl で定義されていますので、ComboBox、ListBox、ListView 等、内部に複数の要素を一覧表示できるコントロールにしかありません。
そしてこれは、一覧表示するコレクションを表します。
つまり、設定できるのはコレクションのみということになります。
ItemsSource はデータバインディングとは無関係なプロパティです。
TextBox に Text があるように、ComboBox や ListBox には ItemsSource があるという感覚で良いでしょう。
ポイント
ItemsSource を持つコントロールでは、ItemsSource=”{Binding}” と書いて ItemsSource を DataContext と同じにすることも多いですが、必ずしもそうとは限りません。
ItemsSource != DataContext となる例を1つ挙げてみます。
今、以下のようなクラスが定義されているとします。
public class Bar
{
}
public class Foo
{
public List<Bar> Bars { get; set; }
}
listBox1 の DataContext にこの Foo クラスのインスタンスが設定されている場合、
ItemsSource=”{Binding Path=Bars}”
と書くことで、listBox1 には Bars の要素が表示されます。
となります。
開発規模が大きくなるとこういうケースの方が多くなってきますので、しっかりと理解するようにしましょう。
コメント