我有一个组合框的
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
我在设置器上设置了断点,但它们从未被触发。这可能是错误的,但我相信这也发生在
List<T>
上。因此,当我使用 OnPropertyChanged(nameof(<PropertyName>))
键的新值更新字典时,我尝试调用 List<string>
。那行不通。我会得到和以前一样的行为。
如果它很重要,我会像这样更新字典
ItemSources[key].Add(value);
任何帮助将不胜感激。如果需要,我可以提供有关我的具体解决方案的更多信息。
字典本质上不是可观察的,这意味着对字典的更改可能不会自动触发 UI 中的更新。考虑使用 ObservableDictionary。
您可以实现它或查找提供字典更改通知的第三方实现。当在字典中添加或删除项目时,这些通知可以触发 UI 中的更新。
另外,你可以使用ObservableCollection来存储字典,你可以监听CollectionChanged事件来检测字典的变化。
最后,在 XAML 中,像这样绑定 ComboBox:
<ComboBox Name="myComboBox" ItemsSource="{Binding MyDictionaryCollection}" DisplayMemberPath="Key" SelectedValuePath="Value" />
确保您的 DataContext 设置为 MyViewModel 的实例,并且对 ObservableCollection 的更新将触发 ComboBox 中的更新。另外,请确保您对 ViewModel 中的字典所做的任何更改都能正确更新 ObservableCollection。
尝试一下,让我知道它是否有效。