c# - переменной - wpf привязка к свойству класса




Как привязка WPF различает свойство indexer и элемент списка? (2)

На самом деле у вас есть два свойства индексатора, один из которых принимает аргумент int и тот, который принимает string аргумент. Честно говоря, я не знаю, как выражение привязки выбирает, какой индейер использовать, когда он неоднозначен. Если есть только один, то он может принуждать индекс к типу аргумента индексатора. Если их два, он может либо выбросить исключение, либо выбрать его в соответствии с эвристикой. В этом случае он, по-видимому, выбрал неправильный.

Чтобы решить эту проблему, вы можете либо переместить указатель строки «вниз по уровню», чтобы он зависает от нового свойства, чтобы он не конкурировал с индексом списка, или если все, что вам нужно, это List[0] вы можете добавить First свойство и обход либо индексатора.

У меня есть привязка формы:

Path=SpecialCollection[0]

Класс SpecialCollection расширяет ObservableCollection и обладает свойством индексатора.

public T this[string propertyValue]
{
    get
    {
        // do stuff
        return default(T);
    }
}

Моя проблема в том, что привязка пытается получить значение свойства indexer вместо того, чтобы возвращать 0-й элемент в коллекции. Есть ли способ заставить привязку обрабатывать 0 как целое число, чтобы он возвращал элемент коллекции, а не вызывал getter свойства индексатора коллекции?


Согласно MSDN вы можете указать привязку типа значения, введенного как индекс:

Внутри индексаторов вы можете иметь несколько параметров индексатора, разделенных запятыми (,). Тип каждого параметра может быть задан круглыми скобками. Например, вы можете иметь Path = "[(sys: Int32) 42, (sys: Int32) 24]", где sys сопоставляется с пространством имен System.

Я заметил, что конструктор Binding , использующий строку пути, использует другой конструктор PropertyPath чем преобразователь типа PropertyPath по умолчанию, указанный конструктор PropertyPath не работает в этом сценарии. Чтобы избежать проблемы, избегайте конструктора Binding , установив свойство Path вручную, которое вызывает преобразование через преобразователь типов.

<!-- Does not work -->
<TextBlock Text="{Binding [(sys:Int32)0]}"/>
<!-- Does work -->
<TextBlock Text="{Binding Path=[(sys:Int32)0]}"/>






indexing