WPF Combobox CompositeCollection 绑定 ComboboxItem 内容和字符串列表

本文关键字:字符串 列表 ComboboxItem Combobox CompositeCollection 绑定 WPF | 更新日期: 2023-09-27 18:27:05

我正在使用WPF,我的视图中有一个组合框。我的要求是在组合框中显示名称列表(范围从 0 到 n 个元素(和一个可本地化的字符串"虚拟名称"。所以我从两个不同的来源获取组合框的 ItemsSource,一个名为"名称"的字符串列表 + 一个本地化字符串"虚拟名称"。这一切都很有效。所有元素都按原样显示。这是我在 WPF 中的定义:

<CollectionViewSource Key="NamesSource" Source="{Binding Context.Data.Names}" />
<ComboBox HorizontalAlignment="Stretch" VerticalAlignment="Top" SelectedItem="{Binding Person.LastName}">
  <ComboBox.ItemsSource>
    <CompositeCollection>
      <ComboBoxItem Content="{Static res:Labels.DummyName_Combobox_Selection}"/>
      <CollectionContainer Collection="{Binding Source={StaticResource NamesSource}}" />
    </CompositeCollection>
  </ComboBox.ItemsSource>
</ComboBox>

CollectionViewSource是资源字典的一部分,我只是省略了它。问题出在 ComboBoxItem 元素上。

在组合框中选择它时,它将字符串"Combobox:虚拟名称"分配给Person.LastName,而不是"虚拟名称"。

将组合框的 SelectedMemberPath 属性设置为"内容"也不起作用(我猜是因为名称中的字符串没有内容属性(。

当在组合框中选择"虚拟名称"而不是"组合框:虚拟名称"时,如何使其将"虚拟名称"分配给 Person.LastName?

WPF Combobox CompositeCollection 绑定 ComboboxItem 内容和字符串列表

我现在向

CompositeCollection 添加了一个 StaticExtension,而不是 ComboboxItem。所以现在看起来像这样。

<CollectionViewSource Key="NamesSource" Source="{x:Binding Context.Data.Names}" />
<ComboBox HorizontalAlignment="Stretch" VerticalAlignment="Top" SelectedItem="{x:Binding Person.LastName}">
  <ComboBox.ItemsSource>
    <CompositeCollection>
      <x:Static Member="res:Labels.DummyName_Combobox_Selection"/>
      <CollectionContainer Collection="{x:Binding Source={StaticResource NamesSource}}" />
    </CompositeCollection>
  </ComboBox.ItemsSource>
</ComboBox>

这似乎达到了预期的效果。

问题是因为您要向集合中添加ComboBoxItem,因此您的集合现在有一堆字符串和一个ComboBoxItemPerson.LastName绑定需要一个字符串,因此 WPF 在ComboBoxItem上调用ToString(),这恰好输出"ComboBoxItem:"+ 其内容。

您需要添加另一个string而不是ComboBoxItem。这有点棘手,因为通常使用资源绑定到属性,而不是文本 xaml 元素。但是,您可以使用 ObjectDataProvider .

<CompositeCollection>
  <ObjectDataProvider ObjectInstance="{Static res:Labels.DummyName_Combobox_Selection}" />
  <CollectionContainer Collection="{Binding Source={StaticResource NamesSource}}" />
</CompositeCollection>