C # WPF décochez les cases

J’utilise MS Visual 2013 Express, C # et WPF.

Dans mon programme, il y a six cases à cocher, et quand l’une d’elles est cochée, les cinq autres doivent être décochées.

J’ai cherché sur Google les deux dernières heures, mais je ne trouve pas de solution en tant que débutant en C #. En java, je voudrais juste écrire checkbox1.setSelected(false);

J’ai ajouté un clickevent, un evet coché et non coché dans le code C #. J’ai ajouté coché et décoché dans le fichier .xaml, mais je ne sais pas trop comment le faire fonctionner.

J’espère que vous pourrez m’aider 🙂

========================

Ma solution:

Merci de votre aide. J’ai essayé des trucs aléatoires avec “IsChecked” que vous avez suggéré et que ça fonctionne heureusement.

.Xaml ressemble à:

        

Code C # pour CheckBox1:

  private void CheckBox1_Checked(object sender, RoutedEventArgs e) { CheckBox1.IsChecked = true; CheckBox2.IsChecked = false; CheckBox3.IsChecked = false; CheckBox4.IsChecked = false; CheckBox5.IsChecked = false; CheckBox6.IsChecked = false; } 

par exemple pour CheckBox2:

  private void CheckBox2_Checked(object sender, RoutedEventArgs e) { CheckBox2.IsChecked = true; CheckBox1.IsChecked = false; CheckBox3.IsChecked = false; CheckBox4.IsChecked = false; CheckBox5.IsChecked = false; CheckBox6.IsChecked = false; } 

Donc, au final, c’est une tâche très facile à faire.

 checkbox1.IsChecked = false; 

Propriété ToggleButton.IsChecked

Je le lis comme un spécial qui décoche les 5 autres.
Si vous souhaitez en vérifier une seule à la fois, RadioButton le fera.
Par défaut, vous ne pouvez pas décocher un bouton radio.
Cela permettrait à tous les 6 non vérifié.

Je pense que la liaison est meilleure et implémente INotifyPropertyChanged

 private Bool cbSecial = false; private Bool cb1 = false; private Bool cb2 = false; public Bool CbSpecial { get { return cbSecial; } set { if (value == cbSecial) return; cbSecial = value; if (cbSpecial) { Cb1 = false; Cb2 = false; ... } NotifyPropertyChanged("CbSpecial"); } } public Bool Cb1 { get { return cb1; } set { if (value == cb1) return; cb1 = value; NotifyPropertyChanged("Cb1 "); } } 

BradleyDotNET est correct: avoir une CheckBox donnée dans un groupe en décochant le rest est essentiellement la fonction d’un RadioButton, et vous n’avez pas besoin de faire quoi que ce soit pour implémenter ce type de comportement.

Toutefois, si vous souhaitez vraiment utiliser CheckBox à la place, vous pouvez le faire en conservant une référence à chaque valeur CheckBox IsChecked dans une propriété de votre ViewModel auquel vous êtes lié par TwoWay et en conservant un IEnumerable interne de vos six. valeurs, comme si:

 private bool? checkBox1IsChecked = false; public bool? CheckBox1IsChecked { get { return checkBox1IsChecked; set { UncheckAllCheckBoxes(); checkBox1IsChecked = true; } } public bool? CheckBox2IsChecked { get; set; } ... // include 1 through 6 here private List yourCheckStates = new List { checkBox1IsChecked, ... }; 

Vous pouvez utiliser quelque chose comme ceci chaque fois que le statut change sur l’un d’entre eux:

 private void UncheckAllCheckBoxes() { foreach (bool? cbIsChecked in yourCheckStates) { cb.IsChecked = false; } } 

Et définissez ensuite la valeur de celle qui vient d’être modifiée sur true. Chaque fois qu’une case est cochée, les cinq autres seront toujours décochées.

Edit: Si j’ai mal compris cela, comme le suggère Blam, et que vous vouliez dire qu’un CheckBox en particulier désélectionne tous les autres, n’incluez alors l’appel à UncheckAllCheckBoxes() dans la propriété que pour la valeur IsChecked de ce CheckBox spécifique et ajoutez une ligne pour définir cet IsChecked de CheckBox spécial sur false dans tous les autres setters.

Vous pouvez choisir l’une des manières suivantes:

  1. RadioButton s dans un groupe
  2. Selector avec un ItemTemplate personnalisé

Boutons Radio:

    

Sélecteur:

        

Remarque: j’ai choisi ListBox titre d’exemple, mais vous pouvez sélectionner tout ce qui provient de Selector .

  { if (CheckBox1.Checked) {Label1.Text = "Checked Apple"; } if (CheckBox1.Checked == false) { Label1.Text = "Unchecked Apple"; } } protected void CheckBox2_CheckedChanged(object sender, EventArgs e) { if (CheckBox2.Checked) { Label1.Text = "Checked Banana"; } if (CheckBox2.Checked == false) { Label1.Text = "Unchecked Banana"; } } 

Vous pourriez trouver cela utile. J’avais un menu wpf “Logging Level” (Niveau d’enregistrement) pour lequel je ne voulais activer qu’une sélection à la fois (c.-à-d. Décocher tous les autres éléments du menu lorsqu’ils étaient sélectionnés). Mon astuce consistait à utiliser la méthode FindName () et une option “tag” dans xaml (pour générer les noms d’une boucle for for). De cette façon, j’ai évité d’avoir un tas de lignes “= false” et juste un seul appel de fonction partagée pour chaque élément de formulaire.

        

Et la fonction pour décocher les autres options, avec le code bonus pour enregistrer les parameters est:

 private void mnuLogging_Checked(object sender, RoutedEventArgs e) { int LogLevel = Convert.ToInt32( ((MenuItem)sender).Tag.ToSsortingng()); Properties.Settings.Default["LogLevel"] = LogLevel.ToSsortingng(); Properties.Settings.Default.Save(); // Uncheck everybody but me (as determine by "Tag") for (int i=0; i < 4; i++) { MenuItem item = Main.FindName("mnuLogging"+i) as MenuItem; if (i != LogLevel) item.IsChecked = false; } }