web-dev-qa-db-ja.com

DataContextとItemsSourceが冗長でないのはなぜですか?

WPFデータバインディングでは、バインドするデータを要素に通知するDataContextItemsSource which "があることを理解しています。バインディングを行います」。

しかし、例えばこの単純な例では、ItemsSourceが何か有用なことをしているようには見えません。要素にDataContextに対して他に何をさせたいですか。 bindto it

<ListBox DataContext="{StaticResource customers}" 
         ItemsSource="{Binding}">

そして、ItemsSourceのより複雑な例では、DataContextの領域に侵入しているように見えるパスとソースがあります。

ItemsSource="{Binding Path=TheImages, Source={StaticResource ImageFactoryDS}}"

さまざまなコーディングシナリオでそれぞれをいつどのように適用するかを知るために、これら2つの概念を理解するための最良の方法は何ですか?

34
Edward Tanguay

DataContextは、明示的なソースが指定されていない場合に、バインディングのコンテキストを取得するための便利な方法です。これは継承されるため、次のことが可能になります。

<StackPanel DataContext="{StaticResource Data}">
    <ListBox ItemsSource="{Binding Customers}"/>
    <ListBox ItemsSource="{Binding Orders}"/>
</StackPanel>

ここで、CustomersOrdersは、「データ」と呼ばれるリソースのコレクションです。あなたの場合、あなたはちょうどこれをすることができたでしょう:

<ListBox ItemsSource="{Binding Source={StaticResource customers}}"/>

他のコントロールはコンテキストセットを必要としなかったので。

24
Kent Boogaart

ItemsSourceプロパティは、コレクションオブジェクトに直接バインドされますOR DataContextプロパティのバインドオブジェクトのコレクションプロパティ。

Exp:

Class Root
{
   public string Name;
   public List<ChildRoot> childRoots = new List<ChildRoot>();
}

Class ChildRoot
{
   public string childName;
}

ListBoxコントロールをバインドする方法は2つあります。

1)DataContextとのバインディング:

    Root r = new Root()
    r.Name = "ROOT1";

    ChildRoot c1 = new ChildRoot()
    c1.childName = "Child1";
    r.childRoots.Add(c1);

    c1 = new ChildRoot()
    c1.childName = "Child2";
    r.childRoots.Add(c1);

    c1 = new ChildRoot()
    c1.childName = "Child3";
    r.childRoots.Add(c1);

treeView.DataContext = r;

<TreeViewItem ItemsSource="{Binding Path=childRoots}" Header="{Binding Path=Name}">
<HierarchicalDataTemplate DataType="{x:Type local:Root}" ItemsSource="{Binding Path=childRoots}">

2)ItemSourceとのバインド:

ItemsSourceプロパティは常にコレクションを取得します。ここでは、ルートのコレクションをバインドする必要があります

List<Root> lstRoots = new List<Root>();
lstRoots.Add(r);

<HierarchicalDataTemplate DataType="{x:Type local:Root}" ItemsSource="{Binding Path=childRoots}">

最初の例では、そのオブジェクト内にオブジェクトを持つbind DataContextがあり、ItemSourceプロパティでバインドしたコレクションがあります。2番目の例では、ItemSourceプロパティをコレクションオブジェクトに直接バインドしています。

5
Nimesh Patel