2012-11-09 116 views
1

在我的ViewModel中,我有一個Dictionaryable的可觀察字符串集合,聲明如下。將WPF組合框綁定到Dictionary <String,ObservableCollection <String>>

public Dictionary<string, ObservableCollection<string>> NamePartsDict { get; set; } 

我想詞典綁定到組合框在我的用戶界面以這樣的方式,每個組合框可以「選擇」綁定到哪個集合。

所以在我的XAML,我想用:

<ComboBox x:Name="comboBox" IsEditable="True" 
    ItemsSource="{Binding CurrentLibrary.NamePartsDict[Year]}" Margin="80,0,0.871,0"></ComboBox> 

,我會希望綁定到由密鑰「年」索引的集合,並填充與存儲在字符串組合框集合。

但是,這個XAML導致一個空的組合框。

我已驗證字典本身可以綁定。下面的XAML使用每個鍵,值對的字符串表示填充組合框。

<ComboBox x:Name="comboBox" IsEditable="True" 
    ItemsSource="{Binding CurrentLibrary.NamePartsDict}" Margin="80,0,0.871,0"></ComboBox> 

當從字典中獲取值時,我的綁定路徑中的內容有誤嗎?或者我正在嘗試做一些不可能的事情(在這種情況下,我將不得不尋找另一種方式!)?

任何幫助非常感謝!

+0

我剛測試過它,它對我來說工作正常。請檢查'NamePartsDict [Year]'中是否有任何項目。 – Clemens

+0

是的,那裏肯定有物品。那麼,如果它適合你,至少我知道這是可能的,所以我想我有一些調試要做!謝謝。 – JimmyTacks

+0

@Clemens我用一個簡單的應用程序創建了一個工作示例,並驗證了字典中的集合可以綁定到。然而,我現在也複製了非工作場景,這似乎是這樣做的,因爲我的字典是ViewModel中的對象的屬性,而不是ViewModel本身的屬性。因此'ItemsSource =「{Binding Path = Dict [MyCollection2]}'起作用,其中Dict是ViewModel的屬性,但是'ItemsSource =」{Binding Path = DH.Dict [MyCollection2]}'不起作用,其中DH是ViewModel的DictionaryHolder類屬性。 – JimmyTacks

回答

0

你應該在這裏使用一個DataTemplate 喜歡在這裏:

/// <summary> 
/// Returns a 
/// </summary> 
public class DomainValueConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     ObservableCollection<DomainValue> retVal = null; 
     DomainDefinitionCollection dds = value as DomainDefinitionCollection; 
     if (dds != null) 
     { 
      retVal = dds[parameter.ToString()]; 
     } 
     return retVal; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

<controls:ComboBox VerticalAlignment="Center" 
     DisplayMemberPath="Name" 
     SelectedValuePath="Value" 
     SelectedValue="{Binding ChildClientEntity.EditableEntity.EditableAttributes.TeamPosition, Mode=TwoWay}" 
     ItemsSource="{Binding ChildClientEntity.Domains, Converter={StaticResource DomainValueConverter}, ConverterParameter=SiteVisitTeamPosition}" /> 

其中ConverterParameter是關鍵到: http://www.codeproject.com/Articles/47923/Using-a-different-DataTemple-when-a-WPF-ComboBox-i

+0

這是爲什麼?它應該只是按預期工作。 – Clemens

0

我用轉換器解決了這個問題字典,域名。

public Dictionary<string, ObservableCollection<DomainValue>> Domains { get; private set; } 
相關問題