INotifyPropertyChang(ed/ing)とインデクサを扱う際には、少なくとも2つの警告があります。
最初に、魔法のプロパティ名文字列を避けるのはpopular methodsのほとんどが効果がないということです。 [CallerMemberName]
属性によって作成された文字列の最後に '[]'がありません。また、lambdaメンバ式には、その概念を表現する上で問題があります。 postsotherいくつかの
() => this[] //Is invalid
() => this[i] //Is a method call expression on get_Item(TIndex i)
() => this //Is a constant expression on the base object
は合理的であるが、2番目の潜在的な問題を提起"Item[]"
文字列リテラルを、避けるためにBinding.IndexerName
を使用しています。 WPFの関連部分の解体を調べると、PropertyPath.ResolvePathPartsで次のセグメントが表示されました。
if (this._arySVI[i].type == SourceValueType.Indexer)
{
IndexerParameterInfo[] array = this.ResolveIndexerParams(this._arySVI[i].paramList, obj, throwOnError);
this._earlyBoundPathParts[i] = array;
this._arySVI[i].propertyName = "Item[]";
}
一定の値として"Item[]"
の繰り返し使用は、WPFは、それが(実際のプロパティは、いわゆる気にしない場合でも、それはPropertyChangedイベントに渡された名前であることを期待して、されていることを示唆しているI私の満足感を一方的に、あるいは他の方法で判断しなかった)、[IndexerName]
の使用を避けて、一貫性を維持するだろう。
それは素晴らしい動作します。奇妙なことに、私は自分のGoogle検索でそのブログポストを見逃してしまった。 – Inferis
このソリューションは素晴らしいですが、厄介な制限があります:1つのキーに対してのみ値が変更されるように指定することはできません...したがって、多くのキーにバインディングがある場合、それらはすべてリフレッシュされます –
数年後'nameof'というキーワードがあります。すべての私の 'FirePropertyChange'呼び出しにこれを使用しますが、インデクサーを' nameof'することはできますか? – Flynn1179