#wpf #xaml #binding #datatrigger
#wpf #xaml #привязка #datatrigger
Вопрос:
Итак, у меня есть класс, к которому я хочу привязаться:
public class Awesome {
public bool OptionA1 { get; set; }
public bool OptionA2 { get; set; }
public bool OptionB1 { get; set; }
public bool OptionB2 { get; set; }
}
Когда я предоставляю этот класс в своем графическом интерфейсе, у меня есть две переключающие кнопки (называемые radioButtonA и radioButtonB), которые позволяют пользователю выбирать между группами A и B, и у меня есть два флажка, позволяющие пользователю изменять A1 / A2 и B1 / B2 соответственно, в зависимости от того, какая radiobutton отмечена.
Логика в классе технически не проводит различий между A и B, как я делаю в своем графическом интерфейсе. Таким образом, если OptionA1 == True и OptionB1 == True, класс выполнит поведение для OptionA1 и B1, как и ожидалось.
Однако, я хочу представить группы A и B как исключительные-or: это означает, что если для OptionA1 или OptionA2 установлено значение true, OptionB1 и OptionB2 оба должны быть false. И наоборот.
Следующая привязка автоматически переназначит флажок в зависимости от того, какая radiobutton / группа установлена, но она не обеспечивает соблюдение отношений exclusive-or между группами. Таким образом, пользователь может нажать RadioButtonA и установить оба флажка. Если пользователь затем нажимает RadioButtonB, для опций 1 и OptionA2 по-прежнему устанавливается значение true (как и ожидалось). Как мне автоматически присвоить им значение false при проверке RadioButtonB?
<CheckBox Content="Do Option 1">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=radioButtonA, Path=IsChecked}" Value="True">
<Setter Property="IsChecked">
<Setter.Value>
<Binding Path="OptionA1" Mode="TwoWay"/>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=radioButtonB, Path=IsChecked}" Value="True">
<Setter Property="IsChecked">
<Setter.Value>
<Binding Path="OptionB1" Mode="TwoWay"/>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
Комментарии:
1. Я бы рекомендовал поместить эту логику в Viewmodel, адаптированную к описываемой вами проблеме.
2. Цель состояла в том, чтобы сделать это в XAML, если это возможно.
Ответ №1:
Я не думаю, что вы сможете сделать это в обычном XAML. Вам придется либо написать код в вашем code-behind / viewmodel, либо написать пользовательский IValueConverter (возможно, мультиконвертер?) это обрабатывает. В любом случае, это некоторый код.