WPF: привязка Grid.Visibility OneWay к свойству зависимости и OneWayToSource к свойству CLR модели представления
У меня есть Grid, к которому свойство 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 Grid.Visibility к Expander.IsExpanded и MyProperty, но это не дает желаемого эффекта. MyProperty не изменяется на Grid.Visibility при обновлении Grid.Visibility в результате измененияExpander.IsExpanded.
Единственный вариант, который, кажется, работает, - это использовать присоединенное свойство в Grid, которое привязывается к Expander.IsExpanded, а затем использовать функцию обратного вызова для программного изменения Grid.Visibility при каждом изменении присоединенного свойства. Сетка. Видимость затем привязывается кMyProperty. Это просто грязный способ сделать это, но я открыт для предложений.
Полагаю, что я пытаюсь сделать, это почти как двусторонняя привязка, в которой две привязки направлены в противоположные стороны, одна из которых является свойством зависимости, а другая - свойством CLR.
Спасибо за любую помощь, которая может быть оказана!
1 ответ
Я думаю, что вы можете установить видимость сетки с помощью триггеров на Expanders и привязать grid.Visibility к вашей ViewModel. Этот подход похож на ваше решение с кодом позади, но с триггерами вместо кода.
На мой взгляд, ваше решение с кодом тоже достаточно хорошее. Кто сказал, что все должно быть в XAML, а не в коде. Выделение кода обычно вредно для бизнес-логики и тому подобное, но вполне нормально иметь визуальную логику в выделении кода, если она не может быть выражена только в XAML.