Montag, 20. Mai 2013

Wie funktioniert eigentlich ein RadioButton?

Wie schon in einem vorherigen Post beschrieben, möchte ich den WPF Expander um die GroupName Eigenschaft erweitern. Um dies zu tun, sollte man sich vorher einfach mal den RadioButton anschauen. Schließlich arbeitet dieses Control nach dem gewünschten Verhalten.

Der RadioButton ist generell eine spezielle Ausprägung des ToggleButtons. Der RadioButton bzw. ToggleButton ist eines der wenigen Controls, die über einen Namen Bezug zu anderen Controls haben. Besitzen zum Beispiel zwei RadioButtons auf einer View den gleich GroupName, kann immer nur ein Control angewählt werden.

Aber wie funktioniert das eigentlich? Was passiert hinter den Kulissen?
An sich ist die Umsetzung gar nicht so kompliziert. Jedes Control überwacht die IsChecked Property. Wird das Control ausgewählt (IsChecked wird auf true gesetzt), wird zwischen zwei Situationen unterschieden und es passiert folgendes:

  1. Es wurde beim aktuellen Control kein GroupName angegeben, so werden alle RadioButtons des selben Parents, die ebenfalls keinen GroupName besitzen und deselektiert (IsChecked wird auf false gesetzt).
    Im folgenden Beispiel kann immer nur einer der Buttons 1, 2 oder 3 gesetzt werden. Button 4 spielt hierbei keine Rolle!
     <StackPanel>  
         <RadioButton x:Name="button1">Button 1</RadioButton>  
         <RadioButton x:Name="button2">Button 2</RadioButton>  
         <RadioButton x:Name="button3">Button 3</RadioButton>  
     </StackPanel>  
     <RadioButton x:Name="button4">Button 4</RadioButton>
    

  2. Wird ein GroupName angegeben, werden alle RadioButtons geprüft, ob sie den gleichen Namen und die gleiche VisualRoot besitzen. Bei all diesen, werden die Elemente, die nicht angeklickt worden sind deselektiert.
    Im folgenden Beispiel bilden die RadioButtons 1, 2 und 4 eine Gruppe. Das StackPanel spielt dabei keine Rolle, ebenso wie der RadioButton 2.
  3.  <StackPanel>  
       <RadioButton x:Name="button1" GroupName="Group1">Button 1</RadioButton>  
       <RadioButton x:Name="button2">Button 2</RadioButton>  
       <RadioButton x:Name="button3" GroupName="Group1">Button 3</RadioButton>  
     </StackPanel>  
     <RadioButton x:Name="button4" GroupName="Group1">Button 4</RadioButton>  
    

Für die Umsetzung des erweiterten ExpanderControls heißt dies nun, dass das Control jede Änderung der IsExpanded, anstatt der IsChecked Property überwachen müsste und sich genauso wie der RadioButton verhalten sollte.