WPF 数据绑定到字典<sting,List<string>> 打开 ComboBox 后不更新

问题描述 投票:0回答:1

我有一个组合框的

itemSource
属性绑定到
Dictionary<string,List<string>>
类型的属性。这样我就不需要在数据上下文文件中创建大量属性。例如,我有 2 个组合框(CoBoA、CoBoB),并且我有一个字典

private Dictionary<string, List<string>> _itemSources = new Dictionary<string, List<string>>()
{
    {"CoBoA", new List<string>() }, {"CoBoB", new List<string>() }
};
public Dictionary<string, List<string>> ItemSources
{
    get
    {
        return _itemSources ;
    }
    set
    {
        _itemSources = value;
        OnPropertyChanged(nameof(ItemSources));
    }
}

// initialise populate itemSources in constructor or elsewhere
<!-- CoBoA -->
<ComboBox IsEditable="True"
          ItemsSource="{Binding ItemSources[CoBoA]}"/>
<!-- CoBoB -->
<ComboBox IsEditable="True"
          ItemsSource="{Binding ItemSources[CoBoB]}"/>

当您打开 ComboBox 时,添加到字典中 List 值的任何新项目(打开 ComboBox 后)将不会显示 - 尽管调用了 OnPropertyChanged() 。但是,如果您在打开组合框之前将项目添加到 List 值,它们就会显示出来。

我的二传手根本不运行。

我在设置器上设置了断点,但它们从未被触发。这可能是错误的,但我相信这也发生在

List<T>
上。因此,当我使用
OnPropertyChanged(nameof(<PropertyName>))
键的新值更新字典时,我尝试调用
List<string>
。那行不通。我会得到和以前一样的行为。

如果它很重要,我会像这样更新字典

ItemSources[key].Add(value);

任何帮助将不胜感激。如果需要,我可以提供有关我的具体解决方案的更多信息。

wpf dictionary data-binding combobox
1个回答
0
投票

字典本质上不是可观察的,这意味着对字典的更改可能不会自动触发 UI 中的更新。考虑使用 ObservableDictionary。

您可以实现它或查找提供字典更改通知的第三方实现。当在字典中添加或删除项目时,这些通知可以触发 UI 中的更新。

另外,你可以使用ObservableCollection来存储字典,你可以监听CollectionChanged事件来检测字典的变化。

最后,在 XAML 中,像这样绑定 ComboBox:

<ComboBox Name="myComboBox" ItemsSource="{Binding MyDictionaryCollection}" DisplayMemberPath="Key" SelectedValuePath="Value" />

确保您的 DataContext 设置为 MyViewModel 的实例,并且对 ObservableCollection 的更新将触发 ComboBox 中的更新。另外,请确保您对 ViewModel 中的字典所做的任何更改都能正确更新 ObservableCollection。

尝试一下,让我知道它是否有效。

© www.soinside.com 2019 - 2024. All rights reserved.