WPFデータバインディングでは、バインドするデータを要素に通知するDataContext
とItemsSource
which "があることを理解しています。バインディングを行います」。
しかし、例えばこの単純な例では、ItemsSource
が何か有用なことをしているようには見えません。要素にDataContext
に対して他に何をさせたいですか。 bindto it?
<ListBox DataContext="{StaticResource customers}"
ItemsSource="{Binding}">
そして、ItemsSource
のより複雑な例では、DataContext
の領域に侵入しているように見えるパスとソースがあります。
ItemsSource="{Binding Path=TheImages, Source={StaticResource ImageFactoryDS}}"
さまざまなコーディングシナリオでそれぞれをいつどのように適用するかを知るために、これら2つの概念を理解するための最良の方法は何ですか?
DataContext
は、明示的なソースが指定されていない場合に、バインディングのコンテキストを取得するための便利な方法です。これは継承されるため、次のことが可能になります。
<StackPanel DataContext="{StaticResource Data}">
<ListBox ItemsSource="{Binding Customers}"/>
<ListBox ItemsSource="{Binding Orders}"/>
</StackPanel>
ここで、Customers
とOrders
は、「データ」と呼ばれるリソースのコレクションです。あなたの場合、あなたはちょうどこれをすることができたでしょう:
<ListBox ItemsSource="{Binding Source={StaticResource customers}}"/>
他のコントロールはコンテキストセットを必要としなかったので。
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プロパティをコレクションオブジェクトに直接バインドしています。