2016-12-15 3 views
0

На основании этого ответа https://stackoverflow.com/a/33109026/426386 Я добавляю пустой элемент в коллекцию ComboBox. Поскольку мои выпадающие имеет SelectedValue и SelectedValuePath определенное, я побегу в Bindingerrors:Пустой ComboBoxItem с SelectedValuePath Binding

<UserControl.Resources> 
     <ObjectDataProvider 
      x:Key="CardTypeProvider" 
      MethodName="GetLocalizedEnumValues" 
      ObjectType="{x:Type base:Localize}"> 
      <ObjectDataProvider.MethodParameters> 
       <x:Type 
        TypeName="base:CardTypes" /> 
      </ObjectDataProvider.MethodParameters> 
     </ObjectDataProvider> 
    </UserControl.Resources> 

    <ComboBox   
     DisplayMemberPath="Value" 
     SelectedValue="{Binding GroupByCardType, UpdateSourceTrigger=PropertyChanged}" 
     SelectedValuePath="Key"> 
     <ComboBox.Resources> 
      <CollectionViewSource 
       x:Key="Items" 
       Source="{Binding Source={StaticResource CardTypeProvider}}" /> 
     </ComboBox.Resources> 
     <ComboBox.ItemsSource> 
      <CompositeCollection> 
       <TextBlock /> 
       <CollectionContainer 
        Collection="{Binding Source={StaticResource Items}}" /> 
      </CompositeCollection> 
     </ComboBox.ItemsSource> 
    </ComboBox> 

В ObjectDataProvider возвращает следующий Тип:

Dictionary<Enum, string> 

Чтобы избежать Binding ошибок, которые я хочу, чтобы создать экземпляр KeyValuePair<Enum, string> вместо TextBlock. Возможно как-то?

ответ

0

Я боюсь, что вы не можете создать экземпляры родовых типов в XAML, и вы не можете создать тип, производный от типа значения KeyValuePair < TKey, TValue > либо, но вы можете создать еще один тип, который имеет ключ и значение свойства и добавить экземпляр этого одного к CompositeCollection:

public class EmptyItem 
{ 
    public YourEnum Key { get; set; } 
    public string Value { get; set; } = "(Select)"; 
} 

Это должно удовлетворять обязательный вопрос.

Другой вариант был бы программно добавить фактический KeyValuePair < TKey, TValue > в коллекцию, например:

CompositeCollection cc = comboBox.ItemsSource as CompositeCollection; 
cc.Insert(0, new KeyValuePair<YourEnum, string>(..., "...")); 
+0

Согласно http://stackoverflow.com/a/1708753/426386 Я способный моделировать общий тип, но могу ли я его создать? Или попросить более упростить: могу ли я создавать экземпляры типов (или обернуть их каким-то образом)? – Florian

+0

Вы не можете создавать экземпляры g e n e r i c типов в XAML. Вы можете определить не-общий класс, который обертывает класс KeyValuePair , или вы можете просто добавить к нему свойство Key и Value в соответствии с моим ответом. Все элементы являются экземплярами некоторого типа. – mm8

Смежные вопросы