【问题标题】:Wpf binding with nested properties具有嵌套属性的 Wpf 绑定
【发布时间】:2011-02-19 02:35:44
【问题描述】:

视图模型

我有一个名为 KeyMemberMember 类型的属性。 'Member' 类型有一个名为 AddressesObservableCollectionAddress 由两个字符串组成 - streetpostcode

查看

我有一个 ListBox,其项目源需要设置为 ViewModels 的 KeyMember 属性,并且它应该显示 Address 集合中所有过去地址的 Street

问题

我的 ViewModel 和 View 关系建立正确。

我可以为上面的简单案例编写一个数据模板,如下所示

<ListBox ItemsSource="{Binding KeyMember.Addresses}">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="Address">
            <TextBlock Text="{Binding Street}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

如果我将 KeyMember 从类型 Member 更改为 ObservableCollection 假设集合,我很想知道如何编写 DataTemplate只有一个元素。我不确定这是否是一个有效的方案以及它的实施可行性。

PS:我知道对于集合中的多个元素,我将不得不实现 Master-Detail 模式/场景。我正在调查这个问题。

【问题讨论】:

  • 我有点困惑。为什么要实现单元素集合,而不是简单地实现 INotifyPropertyChanged?它只是一个“实施步骤”,旨在最终处理 0 到 n 个元素的实际集合吗?您是否保证集合将始终只包含一个元素?
  • 我正在学习数据绑定。我没有维护一个元素集合。我只是想知道我们是否可以在这种情况下绑定或该场景无效。假设集合中总是只有一个元素,我们可以数据绑定吗?对于我的实际场景,集合中有零个或多个元素,我正在研究主从模式。我已经成功实现了 INotifyPropertyChanged 并在必要时使用了 CollectionViewSource。

标签: wpf data-binding mvvm listbox


【解决方案1】:

如果你想绑定到第 0 个元素,你可以使用{Binding Path=[0].Addresses},对于支持数组样式索引的集合中的任何其他元素也是如此。我同意 Wonko 的观点,尽管这是一个相当不寻常的要求。

【讨论】:

  • JustABill,谢谢您的回复。正如我之前提到的,这不是我工作的要求。这个问题更多是出于好奇。作为一个新手,像 {Binding Path=[0].Addresses} 这样的绑定是我不知道的新事物,而这正是我想知道的——是否可以显式地绑定到集合中的特定元素。当然,我不会在我的工作中使用它,因为我不会显式地绑定到集合中的特定元素。但知道什么是可能的总是好的,即使在实践中这可能不是最好的事情。
  • 啊,好奇心很好。当您进行验证时,您通常会在绑定路径中看到 [0] - 这是检索当前错误消息的常见(但较差)方式。无论是在那种特定情况下,也可能在您的情况下,如果集合曾经为空,您不应该这样做,因为尝试从空集合中获取 [0] 元素将使 WPF 抛出异常,您不会看到但会减慢你的程序。
  • 谢谢。是否有任何在线资源可供我阅读高级数据绑定技术?
  • 我不知道有什么特别值得推荐的,但我见过的大部分有趣的东西都涉及到 RelativeSource 参数。因此,您可以(使用一个愚蠢的示例)使 UserControl 的背景颜色与其父窗口的背景颜色相同。所以也许看看那个。
猜你喜欢
  • 2017-05-14
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2023-03-13
  • 2020-07-07
  • 2013-08-16
  • 1970-01-01
相关资源
最近更新 更多