При работе с INotifyPropertyChang (ed / ing) и индексаторами есть по крайней мере несколько дополнительных предостережений.
Во-первых, большинство популярных методов избегания строк имен магических свойств неэффективны. В строке, созданной атрибутом [CallerMemberName]
, в конце отсутствует символ '[]', а у лямбда-выражений-членов проблемы с выражением концепции вообще.
() => this[] //Is invalid
() => this[i] //Is a method call expression on get_Item(TIndex i)
() => this //Is a constant expression on the base object
Несколько других записей использовали Binding.IndexerName
, чтобы избежать строкового литерала "Item[]"
, что разумно, но поднимает вторую потенциальную проблему. Исследование разборки связанных частей 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, и, даже если ему все равно, как называется фактическое свойство (которое я не сделал) я не могу определить, удовлетворяю ли я так или иначе), отказ от использования [IndexerName]
будет поддерживать последовательность.