37

在 WPF 数据绑定中,我知道您有DataContext哪个告诉元素它将绑定到哪些数据以及ItemsSource哪个“进行绑定”。

但是例如在这个简单的例子中,它似乎没有ItemsSource做任何有用的事情,因为除了绑定到它之外,您还希望元素对它做DataContext什么?

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

而在更复杂的例子中ItemsSource,你的路径和源头似乎正在侵占DataContext.

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

理解这两个概念以了解何时以及如何在各种编码场景中应用它们的最佳方法是什么?

4

2 回答 2

25

DataContext对于未指定显式源的情况,这只是为绑定获取上下文的一种方便方法。它是继承的,因此可以做到这一点:

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

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

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

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

于 2009-04-27T12:50:48.560 回答
6

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 属性与集合对象绑定。

于 2011-09-01T02:55:03.570 回答