将WPF组合框绑定到Dictionary

将WPF组合框绑定到Dictionary,wpf,binding,dictionary,combobox,Wpf,Binding,Dictionary,Combobox,在我的ViewModel中,我有一个可观察字符串集合的字典,声明如下 public Dictionary<string, ObservableCollection<string>> NamePartsDict { get; set; } 我希望将字典绑定到用户界面中的组合框,这样每个组合框都可以“选择”绑定到哪个集合 因此,在我的XAML中,我想使用: <ComboBox x:Name="comboBox" IsEditable="True" ItemsS

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

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>
从字典中获取值时,绑定路径中是否有错误?还是我在尝试做一些不可能的事情,在这种情况下,我必须找到另一种方法

非常感谢任何帮助


Tim

您应该在此处使用数据模板 就像在这里:

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

/// <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; }

我刚刚测试过这个,它对我来说很好。请检查NamePartsDict[Year]中是否确实有任何项目。是的,确实有项目。好吧,如果它对你有效,至少我知道这是可能的,所以我想我有一些调试要做!谢谢。@Clemens我用一个简单的应用程序创建了一个工作示例,并验证了字典中的集合可以绑定到。但是,我现在也复制了非工作场景,这似乎与以下事实有关:我的字典是ViewModel中对象的属性,而不是ViewModel本身。因此ItemsSource={Binding Path=Dict[MyCollection2]}起作用,其中Dict是ViewModel的属性,但ItemsSource={Binding Path=DH.Dict[MyCollection2]}不起作用,其中DH是ViewModel的DictionaryHolder类属性。@Clemens找到了解决方案。这似乎是一个通知问题。单独引用字典时,我不需要显式调用PropertyChanged事件来填充ComboBox。在字典内引用集合时,调用字典的PropertyChanged事件会更新组合框。我不能说我完全理解这一点,但我相信这有一个很好的理由!