【问题标题】:ComboBox nested properties in DisplayMemberPathDisplayMemberPath 中的 ComboBox 嵌套属性
【发布时间】:2022-01-08 17:54:52
【问题描述】:

我试图理解为什么会这样:

<ComboBox Name="cboServer" HorizontalAlignment="Left" ItemsSource="{Binding Server.Connections}" DisplayMemberPath="ConnectionName" Margin="91,43,0,0" VerticalAlignment="Top" Width="279"/>

但这不是:

<ComboBox Name="cboServer" HorizontalAlignment="Left" ItemsSource="{Binding Server}" DisplayMemberPath="Connections.ConnectionName" Margin="91,43,0,0" VerticalAlignment="Top" Width="279"/>

这样做的原因是因为我想将ComboBoxSelectedValue 属性绑定回我的模型,但我不能,除非我可以访问整个Server

【问题讨论】:

  • 使用 SelectedItem。当项目源绑定到服务器时,该对象是具有许多连接的服务器对象,并且它不知道要显示/显示哪个名称。绑定到连接然后有一个属性 ConnectionName 也可以工作
  • 谢谢 - 我不应该指定“Connections.ConnectionName”,因此它会知道显示哪个?但没有。
  • 不!假设您有服务器对象,并且该服务器有 3 个连接,现在应该显示哪个名称?
  • 好吧,这开始有意义了,但是 ItemsSource="{Binding Server.Connections}" 有什么不同呢?这按预期工作。
  • 你的 DataContext 有一个 Server 属性,这个服务器有一个 Connections 的集合。所以这就是你可以绑定到 Server.Connections 的原因。意味着 ComboBox 中的每个项目都将是一个 Connection 对象。另一方面,如果您绑定到服务器,则 ComboBox 中只有一个服务器对象,并且 DisplayMemberPath 无法将 Connection.ConnectionName 转换为服务器对象中的任何属性。

标签: c# wpf xaml data-binding


【解决方案1】:

DisplayMemberPath 的文档指出:

获取或设置指向源对象上的值的路径,以作为对象的可视化表示。

此属性引用绑定集合的项目类型上的属性路径。

<ComboBox Name="cboServer" HorizontalAlignment="Left" ItemsSource="{Binding Server.Connections}" DisplayMemberPath="ConnectionName" Margin="91,43,0,0" VerticalAlignment="Top" Width="279"/>

现在,第一个变体绑定了Connection 对象的集合(我假设,可能是不同的类型),即Server.Connections 集合。 Connection 类型公开了一个属性ConnectionName,可以将其指定为要在ComboBox 中显示的成员。

如果Connection 有一个属性,例如MyProvider 类型的 Provider 暴露了 Name 属性,那么 DisplayMemberPath="Provider.Name" 也可以。

<ComboBox Name="cboServer" HorizontalAlignment="Left" ItemsSource="{Binding Server}" DisplayMemberPath="Connections.ConnectionName" Margin="91,43,0,0" VerticalAlignment="Top" Width="279"/>

第二个变体不同,因为它绑定了Server 的集合。如果这不是一个集合,无论DisplayMemberPath 是什么,您都会在输出中收到绑定错误。

让我们假设它是任何类型的集合。然后,此类型具有 collection 属性 Connections 和类型为 Connection 的对象,这些对象再次具有属性 ConnectionName。显示路径无法知道您指的是Connections 集合中的哪个具体项目。那么应该显示哪个ConnectionName,第一个,第二个,第42个?

集合本身,即List&lt;Connection&gt;ObservableCollection&lt;Connection&gt; 或其他任何东西都不会暴露ConnectionName,因为它不是Connection。这些是不同的类型,因此属性路径无效。

您可以通过显式引用元素来自己确认这一点,这可以使用绑定语法中的索引器或斜线来完成,请参阅Binding path syntax 以供参考。

<ComboBox Name="cboServer" HorizontalAlignment="Left" ItemsSource="{Binding Server}" DisplayMemberPath="Connections[2].ConnectionName" Margin="91,43,0,0" VerticalAlignment="Top" Width="279"/>

这将显示第三个ConnectionConnectionName。您的示例不等价

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多