Обработка условий exclusive-or при привязке к двум логическим свойствам в XAML

#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 (возможно, мультиконвертер?) это обрабатывает. В любом случае, это некоторый код.