2016-12-15 27 views
0

根據此答案https://stackoverflow.com/a/33109026/426386 我向我的ComboBox集合添加一個空項目。正如我的組合框已經定義了的SelectedValue和SelectedValuePath,我會碰到Bindingerrors:具有SelectedValuePath綁定的空ComboBoxItem

<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> 

爲了避免綁定錯誤我想實例化一個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

您不能在XAML中創建各種類型的實例。你可以定義一個封裝KeyValuePair 類的非泛型類,或者你可以根據我的答案添加一個Key和Value屬性。所有元素都是某種類型的實例。 – mm8