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

时间:2015-12-17 10:05:23

标签: c# wpf xaml combobox compositecollection

我正在使用WPF,我认为我有一个组合框。我的要求是显示一个名称列表(范围从0到n个元素)和一个可本地化的字符串" Dummy Name"在组合框中。所以我从两个不同的来源获取组合框的ItemsSource,一个名为" names" +一个本地化的字符串" Dummy Name"。这一切都运作良好。所有元素都按原样显示。这是我在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元素上。

在组合框中选择它时,它会分配字符串&#34; Combobox:Dummy Name&#34; to Person.LastName,而不是&#34; Dummy Name&#34;。

将SelectedMemberPath属性设置为&#34; Content&#34;因为Combobox也不起作用(我猜因为Names中的字符串没有Content属性)。

如何指定&#34; Dummy Name&#34;当&#34;虚拟名称&#34;到Person.LastName时在组合框中选择,而不是&#34; Combobox:Dummy Name&#34;?

2 个答案:

答案 0 :(得分:1)

我现在向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>

这似乎有预期的效果。

答案 1 :(得分:0)

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

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

来完成此操作
<CompositeCollection>
  <ObjectDataProvider ObjectInstance="{Static res:Labels.DummyName_Combobox_Selection}" />
  <CollectionContainer Collection="{Binding Source={StaticResource NamesSource}}" />
</CompositeCollection>