PR

【C#】【WPF】DataContextとItemsSourceの違い

C#

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 の要素が表示されます。

DataContext = Foo のインスタンス
ItemsSource = Foo のインスタンスの Bars プロパティ

となります。

開発規模が大きくなるとこういうケースの方が多くなってきますので、しっかりと理解するようにしましょう。

コメント

タイトルとURLをコピーしました