.net 通知字典中的某些值已更改
目前,我正在编写我自己的词典,实现。见下文:.net 通知字典中的某些值已更改,.net,wpf,dictionary,key,inotifypropertychanged,.net,Wpf,Dictionary,Key,Inotifypropertychanged,目前,我正在编写我自己的词典,实现。见下文: public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName))
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]}" />
但这也不会更新绑定的WPF元素。
if (base.Item[key] != value)
{
base.Item[key] = value;
if (key == "notifykey") OnPropertyChanged("[Item]");
}
String.empty将通知所有属性,而不仅仅是项
每操作一次,这是因为所有绑定到字典的问题仍在更新。所以我会做一个新的财产 假设您的值是字符串 绑定到KeyedValue
public String KeyedValue
{
get { return base.Item[Index]; }
}
if (key == "Index") OnPropertyChanged("KeyedValue");
也许您需要考虑接口而不是<代码> NoTyFyPryTyType 。如果是这样的话,看看它链接到的博客文章
另外,检查与您的问题类似的前一个问题。它建议您使用的值作为更改通知的属性名称 编辑: 如果要避免使用INotifyCollectionChanged
,可以尝试另一种方法。更改字典,使其值的类型为实现INotifyPropertyChanged
的代理对象
public class MyProxy<T> : INotifyPropertyChanged
{
public T Value
{
// Getter and setter with change notification code here.
}
}
公共类MyProxy:INotifyPropertyChanged
{
公共价值
{
//这里有更改通知代码的Getter和setter。
}
}
然后将这种类型的实例只插入字典一次。将更新字典中值的代码替换为检索代理的代码,然后更新其值
属性
您需要将XAML绑定更改为类似([Item])的值
在回顾了您的一些其他评论之后,看起来这种方法确实适合您。这和我最近不得不做的事情很相似。创建自定义代理和相应的代理。向代理添加ItemName
属性;它可以是只读的,不需要支持更改通知。在ItemName
属性上创建KeyedCollection
实现索引。真是一种享受!如果您愿意,我将添加示例代码。也许有帮助?@J.Steen,不幸的是,该实现将通知所有属性,即使只有一个更改。我正在寻找一种更干净的方法,只更新实际已更改的属性。嗯,值得一试。很抱歉占用您的时间。=)我不确定这是否与问题有关,但由于您使用new
声明索引器属性,因此通过IDictionary
接口(或基类引用)访问字典的任何代码都不会调用它。@Olly,是的,我意识到这一点,而不是与问题无关:)奇怪的是,这也行不通。我会更新我的答案,这样你就可以看到我是如何设置绑定的,也许问题就出在这里。哇,OnPropertyChanged(“”)更新了所有内容-正确吗?然后必须有一个正确的值。需要一个reach但不使用new的try。new
,因为我从Dictionary
类本身继承了属性。我发现使用“Item[]”
作为属性名确实有效。然而,通过这种方式绑定到其他键也会更新。使用属性正是我目前试图避免的:P我目前有50多个属性,这就是为什么我希望使用字典(字符串、对象)
会使我的代码更简单。我认为只有一个KeyedValue,而另一个根本没有。你应该在问题中更清楚地说明这一点。在你不通知或不通知的财产上。如果您有50多个绑定,那么我只需要创建50多个属性。不,INotifyCollectionChanged不关心集合中的属性更改。它只会在添加、删除、移动、替换项目或重置整个集合时通知其他人。当将整个集合绑定到项目资源时,此界面很有用,但它不是为了满足我的需要。@Ruud,我添加了一个指向另一篇文章的链接,这可能很有用。我非常感谢您的输入,但不幸的是使用了绑定。IndexerName
与“Item[]”
相同,正如您可能猜到的那样,将更新所有密钥。我开始认为不可能通知某个索引/键的更改。@RuudLenders-Hmm,我明白你的问题了。我真的认为这更接近于INotifyCollectionChanged
行为,而不是INotifyPropertyChanged
。实际上,当您更改与给定键对应的值时,您正在替换Dictionary.Values
集合中的一项。与NotifyCollectionChangedAction
枚举的Replace
成员相对应的。从概念上讲,indexer属性只是这些基础集合结构的一个方便的包装器。@indexer实现建议您在集合中的某个项被替换时(而不是在该项的某些属性发生更改时)发送通知INotifyCollectionChanged
通过引发值为NotifyCollectionChangedAction.Replace的CollectionChanged事件来支持这种情况。
public class MyProxy<T> : INotifyPropertyChanged
{
public T Value
{
// Getter and setter with change notification code here.
}
}