WPF Combobox CompositeCollection bind ComboboxItem Содержимое и список строк

Я использую WPF, и у меня есть поле со списком на мой взгляд. Мое требование - отобразить список имен (в диапазоне от 0 до n элементов) и локализуемую строку "Пустое имя" в выпадающем списке. Поэтому я взял ItemSource комбинированного списка из двух разных источников, список строк с именем "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.

Когда он выбран в поле со списком, он назначает строку "Combobox: Dummy Name" для Person.LastName вместо "Dummy Name".

Установка атрибута SelectedMemberPath в "Content" для Combobox также не работает (я полагаю, потому что строки из Names не имеют свойства Content).

Как я могу сделать так, чтобы назначить "Dummy Name" для Person.LastName, когда "Dummy Name" выбрано в выпадающем списке вместо "Combobox: Dummy Name"?

2 ответа

Решение

Теперь я добавил StaticExtension в CompositeCollection вместо 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 в вашей коллекции, так что ваша коллекция теперь имеет кучу строк и ComboBoxItem, Person.LastName связывание хочет строку, поэтому WPF вызывает ToString() на ComboBoxItem, что происходит с выводом "ComboBoxItem: " + его содержимое.

Вам нужно добавить еще string а не ComboBoxItem, Это немного сложнее, поскольку обычно вы используете ресурсы для привязки к свойствам, а не к буквальным элементам xaml. Тем не менее, вы можете сделать это с помощью ObjectDataProvider,

<CompositeCollection>
  <ObjectDataProvider ObjectInstance="{Static res:Labels.DummyName_Combobox_Selection}" />
  <CollectionContainer Collection="{Binding Source={StaticResource NamesSource}}" />
</CompositeCollection>
Другие вопросы по тегам