как реализовать инвертированный выбор для флажка в wpf c#

#c# #wpf

#c# #wpf

Вопрос:

Возможно ли инвертировать выбор для флажка в WPF? Например: если есть 3 флажка A, B, C и флажки A и C отмечены, а B не отмечен. Изображение 1: перед нажатием на обратную кнопку проверяются A и C, если я нажимаю на кнопку для обратного выбора, тогда A и C должны быть сняты, а B должен быть отмечен, как показано на изображении2

изображение 2: после нажатия на обратную кнопку B проверяется, а A, C снимаются

Пример обратного выбора

Комментарии:

1. При следовании шаблону MVVM этого легко достичь в viewmodel. Что вы пробовали и с чем вы боретесь?

2. используете ли вы MVVM или программируете в своем коде?

3. Я не использую MVVM

Ответ №1:

РЕДАКТИРОВАТЬ: с добавленной информацией о том, что вы хотите создавать флажки динамически, я рекомендую вам использовать этот код XAML:

         <StackPanel Name="stk">                
            <!-- Add checkboxes dynamically to this stackpanel -->
            <Button Click="Button_Click">Invert</Button>
        </StackPanel>
  

И это событие щелчка

     private void Button_Click(object sender, RoutedEventArgs e)
    {
        foreach (var cb in stk.Children.OfType<CheckBox>())
        {
            cb.IsChecked = !cb.IsChecked;
        }
    }
  

используйте это для добавления флажков:

 stk.Children.Add(new CheckBox());
  

Комментарии:

1. флажки загружаются динамически. Я не знаю, сколько там будет флажков

2. Отредактировал мой ответ для работы с динамическим количеством флажков

Ответ №2:

  <StackPanel>
    <CheckBox Name="CB1" Content="A" IsChecked="True"></CheckBox>
    <CheckBox Name="CB2" Content="B"></CheckBox>
    <CheckBox Name="CB3" Content="C" IsChecked="True"></CheckBox>
    <Button Name="btnInvert" Content="Invert" Click="btnInvert_Click" ></Button>
 </StackPanel>
  

Логика кода:

  private void btnInvert_Click(object sender, RoutedEventArgs e)
    {
        if (CB1.IsChecked == true amp;amp; CB3.IsChecked == true)
        {
            CB2.IsChecked = true;
            CB1.IsChecked = false;
            CB3.IsChecked = false;
        }
        else
        {
            CB2.IsChecked = false;
            CB1.IsChecked = true;
            CB3.IsChecked = true;
        }
    }
  

Или просто:

  private void btnInvert_Click(object sender, RoutedEventArgs e)
    {
        if (CB1.IsChecked == true amp;amp; CB3.IsChecked == true)
        {
            CB2.IsChecked = true;
            CB1.IsChecked = false;
            CB3.IsChecked = false;
        }
    }
  

В зависимости от ваших требований.

 if (CB1.IsChecked == true amp;amp; CB3.IsChecked == trueamp;amp; CB2.IsChecked== false)
        {
            CB2.IsChecked = true;
            CB1.IsChecked = false;
            CB3.IsChecked = false;
        }
        else
        {
            CB2.IsChecked = false;
            CB1.IsChecked = true;
            CB3.IsChecked = true;
        }
  

Комментарии:

1. вы можете использовать CB2.IsChecked = !CB2.IsChecked это, чтобы также инвертировать значение с гораздо меньшим количеством кода, но он хочет использовать его с динамическим количеством флажков

2. Да, конечно, мы можем использовать динамически, но, выполняя статические действия здесь, мы можем реализовать логику: если A и C отмечены, то независимо от того, установлен или снят флажок B, он проверит B и снимет флажок A и B. и если какой-либо из A или C или обоих не отмечен, тоон будет проверять как A, так и C, снимите флажок B.

3. он хочет изменить выбор независимо от текущей статистики не только в том случае, если точная логика, которую он описывает, соответствует