为什么DataContext和ItemsSource不是多余的?

时间:2009-04-27 12:47:37

标签: wpf data-binding datacontext itemssource

在WPF数据绑定中,我了解您有 DataContext ,它告诉元素它要绑定哪些数据以及 ItemsSource 哪个“绑定”。

但是,例如在这个简单的例子中, ItemsSource 似乎没有做任何有用的事情,因为,除了DataContext做什么? >绑定

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

ItemsSource 的更复杂的示例中,您有路径和来源,似乎正在侵占 DataContext 的领域。< / p>

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

了解这两个概念的最佳方法是知道何时以及如何在各种编码方案中应用每个概念?

2 个答案:

答案 0 :(得分:24)

DataContext只是为未指定显式源的情况选择绑定上下文的一种方便方法。它是继承的,这使得这样做成为可能:

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

此处,CustomersOrders是名为“数据”的资源上的集合。在你的情况下,你可以这样做:

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

因为没有其他控件需要上下文集。

答案 1 :(得分:5)

ItemsSource属性将直接与集合对象绑定或者与DataContext属性的绑定对象的集合属性。

经验:

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

Class ChildRoot
{
   public string childName;
}

绑定ListBox控件有两种方法:

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属性始终采用集合。 这里我们必须绑定Root的集合

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

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

在第一个例子中,我们绑定DataContext,其中包含对象,我们有集合,我们用ItemSource属性绑定,其中在第二个例子中,我们直接将ItemSource属性与集合对象绑定。