INotifyPropertyChang (ed/ing) 및 인덱서를 처리 할 때 몇 가지 추가주의 사항이 있습니다.
첫 번째는 마법 속성 이름 문자열을 피하는 대부분의 popular methods이 효과적이지 않다는 것입니다. [CallerMemberName]
속성에 의해 생성 된 문자열 끝에 '[]'가 없으며 람다 멤버 표현식에 개념을 표현하는 데 문제가 있습니다. 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
은 합리적이지만, 두 번째 잠재적 인 문제를 제기 "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
이 솔루션은 훌륭하게 작동하지만 성가신 한계가 있습니다. 하나의 키에 대해서만 값이 변경되도록 지정할 수 없습니다 ... 따라서 많은 키에 바인딩이있는 경우 모두 새로 고칩니다. –
몇 년 후 지금 'nameof'키워드가 있습니다. 나는 모든'FirePropertyChange' 호출에이 값을 사용하지만 어떤 식 으로든 인덱서를'nameof' 할 수 있습니까? – Flynn1179