将WPF ComboBox绑定到Dictionary <string,observablecollection <string>&gt; </string,observablecollection <string>

时间:2012-11-09 11:28:28

标签: wpf binding dictionary combobox

在我的ViewModel中,我有一个可观察字符串集合的字典,声明如下。

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

我想在我的用户界面中将Dictionary绑定到ComboBoxes,这样每个ComboBox都可以“选择”要绑定的集合。

所以在我的XAML中,我想使用:

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

我希望绑定到由Key“Year”索引的Collection,并使用存储在集合中的字符串填充ComboBox。

但是,这个XAML导致一个空的ComboBox。

我已经确认字典本身可以绑定。下面的XAML使用每个Key,Value对的字符串表示填充ComboBox。

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

从字典中获取值时,绑定路径中的某些内容是错误的吗?或者我正在尝试做一些不可能的事情(在这种情况下,我将不得不寻找另一种方式!)?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我使用转换器解决了这个问题:

/// <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是字典的关键字域。

public Dictionary<string, ObservableCollection<DomainValue>> Domains { get; private set; }