WPF: привязка Grid.Visibility OneWay к свойству зависимости и OneWayToSource к свойству CLR модели представления - PullRequest
0 голосов
/ 29 марта 2012

У меня есть Сетка , к которой свойство Visibility привязано к IsExpanded родительского Expander элемента управления.

Всякий раз, когда Grid.Visibility изменяется, я хочу, чтобы свойство ( MyProperty ) в DataContext (модель представления) изменялось соответственно.

Это мой XAML:

<Grid Visibility="{Binding IsExpanded, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}, Converter={StaticResource BoolToVisibilityConverter}}" />

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

grid.SetBinding(VisibilityProperty, new Binding("MyProperty") { Source = DataContext });

Однако это просто заменяет привязку к Expander , уже установленному в XAML.

Я подумал о том, чтобы перевернуть это так, чтобы целью была моя модель представления, а источником была сетка (привязка к Visibility ) и превращение MyProperty в свойство зависимости. Но моя модель представления не является DependencyObject , поэтому я не могу этого сделать.

Я попытался использовать MultiBinding / MultiConverter привязка Сетка. Видимость до Расширитель. Расширение и MyProperty , но это не дает желаемого эффекта. MyProperty не изменяется на Grid.Visibility , когда Grid.Visibility обновляется в результате изменения Expander.IsExpanded .

Единственный вариант, который, кажется, работает, это использование присоединенного свойства к Grid , которое связывается с Expander.IsExpanded , а затем использует функцию обратного вызова для программного изменения Grid.Visibility. всякий раз, когда присоединенное свойство изменяется. Сетка. Видимость затем связывается с MyProperty . Это просто грязный способ сделать это, но я открыт для предложений.

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

Спасибо за любую помощь, которая может быть оказана !!

1 Ответ

0 голосов
/ 30 марта 2012

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

На мой взгляд, ваше решение с кодом тоже достаточно хорошее. Кто сказал, что все должно быть в XAML, а не в коде. Выделение кода обычно вредно для бизнес-логики и тому подобное, но вполне нормально иметь визуальную логику в выделении кода, если она не может быть выражена только в XAML.

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