Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 通知字典中的某些值已更改_.net_Wpf_Dictionary_Key_Inotifypropertychanged - Fatal编程技术网

.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.
    }
}