【问题标题】:How does wpf/databinding resolve this ambiguity?wpf/databinding 如何解决这种歧义?
【发布时间】:2012-12-05 14:35:01
【问题描述】:
<StackPanel DataContext="{StaticResource Employees1}">
    <ListBox ItemsSource="{Binding}" DisplayMemberPath="Name" 
                  IsSynchronizedWithCurrentItem="True"/>
    <Label Content="{Binding Path=Count}"/>
    <Label Content="{Binding Path=Name}"/>
</StackPanel>

如何解决标签的绑定问题?如何决定第二个标签的内容绑定到Employees1.Count(而不是Employee.Count),而第一个标签绑定到 Employee.Name 并与列表框选择同步?另外,如果我想将第一个标签绑定到 Employee.Count 怎么办?

(Employee 具有属性 Name(可能还有 Count),Employees1 是一个 Employee 类型的 ObservableCollection)。


编辑:所以,这里的问题是 WHY 第一个标签显示 ObservableCollection 中的员工人数,而第二个标签显示 特定 员工的姓名集合,即当前在 ListBox 中选择的集合。显然,第一个标签绑定到整个集合,第二个标签绑定到集合中的特定员工。但是为什么,以及如何控制这种行为。

【问题讨论】:

  • 两个标签都包含在StackPanel中,会从StackPanel继承DataContext。 ListBox 和 Label 都使用 Name 是没有意义的,因为 ListBox 是一个重复器控件,它绑定到一个集合,而 Label 不绑定到一个集合。
  • 老实说,这不是具有特定目的的生产代码。我有一个关于为什么这样做的问题。我编辑澄清。

标签: wpf data-binding


【解决方案1】:

来自 MSDN Data Binding Overview, Binding To Collections,“当前项目指针”部分:

因为 WPF 仅通过使用视图(视图 您指定或集合的默认视图),所有绑定到 集合有一个当前项指针。

和“主从绑定场景”部分:

这是有效的,因为当一个单例对象(此中的 ContentControl case) 绑定到一个集合视图,它会自动绑定到 视图的当前项。

在您的示例中,第二个标签 自动 绑定到Employees1 集合的默认视图的当前项。第一个 Label 也会像这样绑定,但由于 item 对象没有 Count 属性,它显然会退回到集合本身的 Count 属性的绑定。但是我不知道后一种行为是否记录在某处。

【讨论】:

  • 有帮助的 +1。但是,第二个标签默认绑定到 Collection 的“Count”属性,即使 Employee 定义了 Count 属性。我真的很想找到一些关于这种行为的文档。我发现我可以通过设置强制绑定到员工 Count 属性: (注意斜线)
  • 好的,那么绑定到集合似乎优先于自动绑定到当前项。我想这是有道理的,因为您始终可以使用前导斜杠显式绑定到当前项目。
【解决方案2】:

正如 Blam 所说 - 标签与列表框没有关系 - 我认为您在这里尝试做的是将具有属性 Count 和 Name 的员工的 observableCollection 绑定到列表框..

为此,您需要列表框中的 ItemsTemplate

<ListBox ItemSource={Binding Employees1}>
<ListBox.ItemTemplate>
  <DataTemplate>
    <StackPanel Orientation="Horizontal">
        <Label Content="{Binding Count}" />
        <Label Content="{Binding Name}" />

    </StackPanel>
  </DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

【讨论】:

  • 不,我不想那样做。实际上,我并没有尝试做任何事情,我只是想知道为什么它会这样做。
  • 好的 - 您问题中的 xaml 是 wpf 可视化树的一部分,除非另有明确说明,否则子元素将继承其父数据上下文。所以 Count 会自动评估 ObservableCollection 的 Count 属性。 Name 将尝试查找Employees1 集合的子属性。如果它在可视化树中找到匹配项,它将显示,否则该值将为空。这有帮助吗?但是,我再次强调,我认为您发布的 xaml 不适合您描述的情况。
  • @TheUnculledBadger “如果在可视化树中找到匹配项......”不正确。绑定源查找不遍历可视树(也不遍历逻辑树)。确切的行为记录在here
【解决方案3】:

让我试着回答问题。

ObservableCollection 有一个属性 Count。

至于在第二个标签上获得单个属性,它正在做出一些假设。
在其他版本的 .NET 中,您可能不会获得相同的行为。
不应将显示单个值的控件绑定到集合。

如果您想从 ListBox 中选择项目,请参阅此链接

enter link description here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多