5

目前我正在编写实现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 元素。

4

2 回答 2

7

也许您需要考虑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-30T14:44:41.123 回答
0
if (base.Item[key] != value)
{
     base.Item[key] = value;
     if (key == "notifykey") OnPropertyChanged("[Item]");
}

String.empty 将通知所有属性,而不仅仅是 Item

根据操作,所有与 Dictionary 的绑定的问题仍在更新。
所以我会做一个新的财产

假设您的值是字符串绑定到 KeyedValue

public String KeyedValue
{
    get { return base.Item[Index]; }
}

if (key == "Index") OnPropertyChanged("KeyedValue");
于 2013-01-30T14:03:41.127 回答