Привязка обновления WPF при привязке непосредственно к DataContext с конвертером - PullRequest
8 голосов
/ 20 апреля 2010

Обычно, когда вы хотите, чтобы элемент управления, связанный с данными, обновлялся, вы используете событие «PropertyChanged», чтобы сообщить интерфейсу, что данные изменились за кулисами.

Например, у вас может быть текстовый блок, привязанный к текстовому тексту со свойством «DisplayText»

<TextBlock Text="{Binding Path=DisplayText}"/>

Отсюда, если DataContext вызывает событие PropertyChanged с PropertyName «DisplayText», то текст этого текстового блока должен обновиться (при условии, что вы не изменили режим привязки).

Тем не менее, у меня есть более сложное связывание, которое использует множество свойств из текста данных для определения окончательного вида и ощущения элемента управления. Для этого я привязываю непосредственно к текстовому тексту и использую конвертер. В этом случае я работаю с источником изображения.

<Image Source="{Binding Converter={StaticResource ImageConverter}}"/>

Как вы можете видеть, я использую {Binding} без пути для привязки непосредственно к текстовому тексту и использую ImageConverter, чтобы выбрать изображение, которое я ищу. Но теперь у меня нет возможности (что я знаю), чтобы сказать, что связывание для обновления. Я попытался поднять событие изменилось с помощью "." как имя свойства, которое не работает.

Возможно ли это? Нужно ли мне заключать логику преобразования в свойство, к которому может быть привязана привязка, или есть способ сообщить привязке обновить (без явного обновления привязки)?

Любая помощь будет принята с благодарностью. Спасибо! -Adam

Ответы [ 3 ]

19 голосов
/ 20 апреля 2010

Обходной путь здесь заключался в добавлении к моему объекту свойства (которое будет использоваться в качестве текста данных) под названием «Self», которое просто возвращало

public Object Self { get { return this; }}

Тогда в привязке я использовал это свойство:

<Image Source="{Binding Path=Self, Converter={StaticResource ImageConverter}}"/>

Тогда, когда я звоню

PropertyChanged(this, new PropertyChangedEventArgs("Self"))

работает как шарм.

Спасибо всем.

2 голосов
/ 20 апреля 2010

Я не верю, что есть способ выполнить именно то, что вам нужно с вашим текущим преобразователем. Как вы упомянули, вы можете сделать расчет в вашей ViewModel или вы можете изменить свой конвертер на IMulitValueConverter.

Исходя из вашего конкретного сценария (преобразователь привязан к классу ViewModel и нескольким его свойствам), я бы склонялся к реализации логики в ViewModel.

0 голосов
/ 20 апреля 2010

Хм, вы не показываете полную реализацию. Но я думаю, что он должен обновиться, если значение, привязанное к GUI, предоставляет PropertyChanged-Event.

Привет

...