此问题已在此处有答案:
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);
任何帮助将不胜感激。如果需要,我可以提供有关我的具体解决方案的更多信息。
2条答案
按热度按时间mf98qq941#
那么,当
List<string>
发生变化时,是否要更新ComboBox
的项?应该使用
ObservableCollection
而不是List
。ObservableCollection
可以通知绑定目标的项目更改。INotifyPropertyChanged
实现是通知“此属性的引用或值已更改”,而不是“此属性的示例已更改”。所以你更新字典项目不会通知任何东西。如果你需要在显示后通知字典内部的变化到绑定目标,请参阅Ferid的答案。
否则,如果ComboBox是静态绑定到现有的字典项,您只需要一个简单的auto属性,并在
Binding
(ItemsSource="{Binding ItemSources[CoBoA], Mode=OneTime}"
)上设置Mode=OneTime
以避免潜在的内存泄漏问题。knsnq2tg2#
字典本身不是可观察的,这意味着对字典的更改可能不会自动触发UI中的更新。考虑使用ObservableDictionary。
您可以实现它,或者找到为字典更改提供通知的第三方实现。当从字典中添加或删除项目时,这些通知可以触发UI中的更新。
此外,您可以使用ObservableCollection来存储字典,您可以监视CollectionChanged事件以检测字典中的更改。
最后,在XAML中,像这样绑定ComboBox:
确保您的DataContext被设置为MyViewModel的示例,并且对ObservableCollection的更新将触发ComboBox中的更新。另外,确保对ViewModel中的字典所做的任何更改都正确地更新了ObservableCollection。
试试看,让我知道它是否有效。