【发布时间】:2013-01-14 08:15:26
【问题描述】:
目前我正在编写实现INotifyPropertyChanged 的自己的字典。见下文:
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
new public Item this[TKey key]
{
get { return base.Item[key]; }
set(TValue value)
{
if (base.Item[key] != value)
{
base.Item[key] = value;
OnPropertyChanged("XXX"); // what string should I use?
}
}
}
我的目标很简单:当 Dictionary 中的某个值发生变化时,通知它发生了变化。然后,所有与相应键名绑定的 WPF 元素都应自行更新。
现在我的问题是:我应该使用什么字符串作为propertyName 来通知?
我试过"[" + key.ToString() + "]"、"Item[" + key.ToString() + "]" 和简单的key.ToString()。它们似乎都不起作用,因为 WPF 元素没有更新。
使用String.Empty ("") 确实会更新 WPF 元素,但我没有使用它,因为这将更新所有绑定同一个字典的 WPF 元素,即使它们具有不同的键。
这就是我的绑定在 XAML 中的样子:
<TextBlock DataContext="{Binding Dictionary}" Text="{Binding [Index]}" />
Index 当然是我字典中的键名。
有些人建议使用INotifyCollectionChanged,而不是使用INotifyPropertyChanged。我试过这个:
Dim index As Integer = MyBase.Keys.ToList().IndexOf(key)
Dim changedItem As Object = MyBase.ToList().ElementAt(index)
RaiseEvent CollectionChanged(Me, New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, changedItem, index))
但这也不会更新绑定的 WPF 元素。
【问题讨论】:
-
也许this code article 有帮助?
-
@J.Steen,不幸的是,即使只有一个更改,该实现也会通知 所有 属性。我正在寻找一种更简洁的方法,它只会更新实际发生变化的属性。
-
当。嗯,值得一试。很抱歉占用您的时间。 =)
-
我不确定这与问题有关,但由于您使用
new声明索引器属性,因此任何通过IDictionary<Key,Valye>接口访问字典的代码都不会调用它(或基类引用)。 -
@Olly,是的,我意识到这一点,不,这与问题无关:)
标签: .net wpf dictionary key inotifypropertychanged