WPF: привязка данных к параметризованным свойствам - PullRequest
1 голос
/ 02 марта 2010

Учитывая этот класс / свойство, как бы я написал выражение привязки данных WPF, чтобы получить myToken.DataItem("Phone")?

Class Token
    Public Property DataItem(ByVal name As String) As Object
        Get
            If m_DataPoints.ContainsKey(name) Then Return m_DataPoints(name) Else Return Nothing
        End Get
        Set(ByVal value As Object)
            Dim oldValue = DataItem(name)
            If Object.Equals(oldValue, value) Then Return
            m_DataPoints(name) = value
            OnPropertyChanged("DataPoint")
        End Set
    End Property
End Class

Ответы [ 4 ]

4 голосов
/ 02 марта 2010

Синтаксис индексатора привязки должен работать для вас, если ваше индексированное свойство объявлено по умолчанию:

Default Public Property DataItem(ByVal name As String) As Object 

В этом случае вы можете использовать:

<TextBox Text="{Binding Token[Phone]}" />

или, если ваш токен - ваш DataContext, просто:

<TextBox Text="{Binding [Phone]}" />

В синтаксисе привязки WPF отсутствует механизм доступа к индексатору, отличному от заданного по умолчанию. Если вы не можете установить индексатор по умолчанию, вам придется использовать конвертер:

<TextBox Text="{Binding Token,ConverterParameter=Phone,Converter={x:Static my:DataItemAccessor.Instance}}" />

Где DataItemAccessor - это тривиальный класс, который вы пишете, который реализует IValueConverter и обращается к DataItem.

0 голосов
/ 30 сентября 2011

Возможно, это скорее обходной путь, чем решение, но позвольте мне поделиться своими опыт : В VB я попытался определить индексированное свойство: Public Property MyIndProp(index As integer) As integer но не смог заставить его работать в привязке, даже с конвертером.

(без конвертера:

с конвертером: )

Решение, которое я нашел, состоит в том, чтобы определить свойство как массив:

Public Property MyIndProp As integer()

и переплет работает без конвертера. ( работает нормально)

0 голосов
/ 02 марта 2010

Почему вы не предоставляете недвижимость "Телефон"?

0 голосов
/ 02 марта 2010

У привязки не может быть параметра.

Я предлагаю написать конвертер. Конвертер может иметь параметр, который он может использовать для доступа к индексированному свойству.

Еще одна попытка - написать реализацию ICustomTypeDescriptor, в которой вы возвращаете подкласс PropertyDescriptor для каждого из ключей в DataItem. Этот подкласс будет использовать DataItem для реализации GetValue.

WPF поверит, что у вас есть свойство Phone, и проверит PropertyDescriptor, чтобы получить его значение. Привязка становится просто: {Binding Path = Phone}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...