1

一見無関係な問題を調査しているときに、予期しない拘束力のある動作に遭遇しました。持っている

class StringRecord : INotifyPropertyChanged
{
    public string Key {get; set; }    // real INPC implementation is omitted
    public string Value { get; set; } // real INPC implementation is omitted
    ...
}

class Container
{
    public ObservableKeyedCollection<string, StringRecord> Params { get; set; }
    ...
{

これで、TextBoxがコレクションアイテムの1つに明白な方法でバインドされると

<TextBox Text="{Binding Params[APN_HOST].Value}" />

StringRecordのインスタンスのPropertyChangedイベントは、テキストの編集時に発生しません。しかし、それを次のように書き直します

<TextBox DataContext="{Binding Params[APN_HOST]}" Text="{Binding Value}" />

奇跡を起こし、イベントは正しく発火し始めます。

なんで?

4

2 に答える 2

2

2番目のxamlサンプルでは、​​バインディングはINotifyPropertyChangedを実装するStringRecordを監視しているため、オブジェクトへの変更が通知されます。

最初のxamlサンプルでは、​​何にバインドしているのかが明確ではありません。

DataContextをContainerバインディングに設定すると、INotifyPropertyChangedインターフェイスを実装していないオブジェクトが監視されます。パスはまだ正しいので、Valueプロパティは引き続き読み取ることができますが、通知を見逃しています。

于 2012-06-10T06:38:20.663 に答える
1

バインディングシステムに文字列インデックスを介してアクセスされるプロパティへの変更について認識させたい場合は、クラスObservableKeyedCollectionPropertyChangedイベントだけでなくイベントも発生させる必要があります。CollectionChanged

これを行うには、ObservableKeyedCollectionimplementINotifyPropertyChangedを作成してから、次のコードを次のコードに追加しますOnCollectionChanged

if (PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs("Item[]"));
}

この回答も参照してください: インデクサープロパティのPropertyChanged

于 2012-06-10T10:34:42.250 に答える