WPF数据绑定到字典&lt;sting,List< string>&gt;打开ComboBox后未更新[重复]

axr492tv  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(111)

此问题已在此处有答案

ObservableCollection<> vs. List<>(5个答案)
10天前关闭。
我有一个组合框的itemSource属性绑定到一个Dictionary<string,List<string>>类型的属性。这样我就不需要在我的文本文件中创建大量的属性。例如,我有2个ComboBox(CoBoA,CoBoB),我有一个dict

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时,添加到字典中Listvalue的任何新项(打开ComboBox后)都不会显示-尽管OnPropertyChanged()被调用。但是,如果您在打开ComboBox之前向List值添加项,它们将显示出来。
我二传手根本不会跑。
我把断点放在setter上,它们永远不会被触发。这可能是错误的,但我相信这也发生在List<T> s上。正因为如此,当我用List<string>键的新值更新dict时,我试图调用OnPropertyChanged(nameof(<PropertyName>))。那不管用。我会得到和以前一样的行为。
如果它很重要,我会像这样更新命令

ItemSources[key].Add(value);

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

mf98qq94

mf98qq941#

那么,当List<string>发生变化时,是否要更新ComboBox的项?
应该使用ObservableCollection而不是ListObservableCollection可以通知绑定目标的项目更改。
INotifyPropertyChanged实现是通知“此属性的引用或值已更改”,而不是“此属性的示例已更改”。
所以你更新字典项目不会通知任何东西。如果你需要在显示后通知字典内部的变化到绑定目标,请参阅Ferid的答案。
否则,如果ComboBox是静态绑定到现有的字典项,您只需要一个简单的auto属性,并在BindingItemsSource="{Binding ItemSources[CoBoA], Mode=OneTime}")上设置Mode=OneTime以避免潜在的内存泄漏问题。

knsnq2tg

knsnq2tg2#

字典本身不是可观察的,这意味着对字典的更改可能不会自动触发UI中的更新。考虑使用ObservableDictionary。
您可以实现它,或者找到为字典更改提供通知的第三方实现。当从字典中添加或删除项目时,这些通知可以触发UI中的更新。
此外,您可以使用ObservableCollection来存储字典,您可以监视CollectionChanged事件以检测字典中的更改。
最后,在XAML中,像这样绑定ComboBox:

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

确保您的DataContext被设置为MyViewModel的示例,并且对ObservableCollection的更新将触发ComboBox中的更新。另外,确保对ViewModel中的字典所做的任何更改都正确地更新了ObservableCollection。
试试看,让我知道它是否有效。

相关问题