#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. он хочет изменить выбор независимо от текущей статистики не только в том случае, если точная логика, которую он описывает, соответствует