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もちろん、私の辞書のキーの名前です。


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 要素も更新されません。

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

次に、このタイプのインスタンスを辞書に 1 回だけ挿入します。ディクショナリ内の値を更新するコードを、プロキシを取得してからその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 だけでなくすべてのプロパティに通知します

ディクショナリへのすべてのバインディングの問題がまだ更新されているため、これを操作します。
だから私は新しいプロパティを作るでしょう

値が文字列であると仮定しましょう KeyedValue へのバインド

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

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