目前,我正在编写实现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?
}
}
}
我的目标很简单:当字典中的某个值发生变化时,通知它已经改变了。所有具有相应键名绑定的WPF元素都应该更新自己。
现在我的问题是:为了通知,我应该使用什么字符串作为propertyName
?
我试过"[" + key.ToString() + "]"
,"Item[" + key.ToString() + "]"
和简单的key.ToString()
。它们似乎都不起作用,因为WPF元素没有更新。
使用String.Empty
(""
)确实会更新WPF元素,但我不使用它,因为这将更新绑定相同字典的所有WPF元素,即使它们有不同的键。
这就是我的绑定在XAML中的样子:
<TextBlock DataContext="{Binding Dictionary}" Text="{Binding [Index]}" />
当然,Index
是我字典中密钥的名字。
有些人建议使用INotifyPropertyChanged,而不是使用INotifyCollectionChanged。我试过这个:
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元素.。
发布于 2013-01-30 06:44:41
也许您需要考虑INotifyCollectionChanged接口,而不是INotifyPropertyChanged
。如果是这样的话,请查看这个问题和它链接到的博客文章。
另外,请检查这个答案上一个类似于您的问题。它建议您使用Binding.IndexerName的值作为更改通知的属性名。
编辑:
如果您想避免使用INotifyCollectionChanged
,可以尝试另一种方法。更改字典,使其值的类型成为实现INotifyPropertyChanged
的代理对象。
public class MyProxy<T> : INotifyPropertyChanged
{
public T Value
{
// Getter and setter with change notification code here.
}
}
然后,只将这种类型的实例插入字典一次。将更新字典中值的代码替换为检索代理的代码,然后更新其Value
属性。
您需要更改XAML绑定到类似([Item]).Value
的内容。
在回顾了您的其他一些评论之后,看起来这种方法可能对您有用。这和我最近不得不做的事情很相似。创建自定义KeyedCollection和相应的代理。向代理添加ItemName
属性;它只能读取,不需要支持更改通知。在KeyedCollection
属性上设置ItemName
实现索引。很好的享受!如果您愿意的话,我会添加示例代码。
发布于 2013-01-30 06:03:41
if (base.Item[key] != value)
{
base.Item[key] = value;
if (key == "notifykey") OnPropertyChanged("[Item]");
}
String.empty将通知所有属性,而不仅仅是项
按照op这个问题,所有绑定到字典的问题仍然更新。
所以我会做一个新的财产
假设您的值是字符串绑定到KeyedValue
public String KeyedValue
{
get { return base.Item[Index]; }
}
if (key == "Index") OnPropertyChanged("KeyedValue");
https://stackoverflow.com/questions/14605278
复制相似问题