2012-04-10 15 views
0

Ich erstelle Checkboxen dynamisch und möchte sie überprüfen, je nachdem, welche Optionen ausgewählt werden sollen.Wie Checkboxen dynamisch überprüft werden?

Ich habe folgende XAML:

 <StackPanel> 
      <StackPanel x:Name="ArmingPanel" /> 
     </StackPanel> 

Und den folgenden Code:

private void AddCheckBoxes(OptionsVM options) 
    { 
     var converter = new FlagsEnumValueConverter(); 
     foreach (Arming arming in Enum.GetValues(typeof(Arming))) 
     { 
      if (arming != Arming.None) 
      { 

       var binding = new Binding() 
       { 
        Path = new PropertyPath("Arming"), 
        Converter = converter,       
        ConverterParameter = arming 
       }; 

       var checkBox = new CheckBox() 
            { 
             Content = arming.ToString(), 
             IsChecked = (options.Options.Arming & arming) != Arming.None 
            }; 

       checkBox.SetBinding(CheckBox.IsCheckedProperty, binding); 
       ArmingPanel.Children.Add(checkBox); 
      } 
     } 
    } 

Je nachdem, welche Flags gesetzt wurden, nach der sollte auf true oder false eingestellt werden:

IsChecked = (options.Options.Arming & arming) != Arming.None 

Ich kann diesen Wert richtig eingestellt w sehen Wenn ich debugge, aber wenn die Checkboxen auf dem Bildschirm aufgelistet sind, sind sie immer deaktiviert.

Wie kann ich sie wie erwartet überprüfen lassen?

+1

Die 'IsChecked'-Eigenschaft, indem Sie Ihre Bindung festgelegt ist. – Matten

+0

Etwas sagt mir, dass deine Bindung gebrochen ist. Sie sollten Ihre IsChecked-Eigenschaft nicht manuell festlegen, wenn Sie sie an etwas binden möchten. –

+0

Wie Matten sagte, wird "IsChecked" sofort nach der Code-Eingabe durch "Bindung" gesetzt. Überprüfen Sie Ihren 'FlagsEnumValueConverter', wenn 'Nullable Clemens

Antwort

2

In Aufruf Sie CheckBox Konstruktor setzen Sie IsChecked, die die IsCheckedProperty auf das Kontrollkästchen setzt. Sie setzen dann die IsCheckedProperty erneut mit einer Binding, so dass die erste Einstellung überschrieben wird.

Ich vermute, dass das Problem mit den Converter ist und die ConverterParameter in der Bindung

-1

EDIT: Dies ist keine Antwort auf die Frage des OP, aber ich denke, es verdient zu erwähnen.

Es scheint, dass Sie für ENUM-Flaggen sind prüfen, ist der richtige Booleschen Ausdruck:

(options.Options.Arming & arming) == arming

wenn dieser Ausdruck true zurückgibt, dann options.Options.Arming die Flagge in arming

gespeichert enthält Es ist auch wichtig, dass Ihre enum Arming Mitglieder korrekt definiert sind!

+0

Das OP sagt, dass der Wert korrekt eingestellt ist, wenn er im Debug-Modus ausgeführt wird. Aber er legt eine Datenbindung an die Eigenschaft fest, nachdem er sie manuell gesetzt hat, wodurch der vorher eingestellte "korrekte" Wert überschrieben wird. Diese 'enum Arming'-Mitglieder sind also korrekt definiert. –

+0

Wir können nicht mit der Definition von "Arming" oder dem Wert von "Arming.None" sprechen, meine "Antwort" hätte ein Kommentar sein sollen, aber es war zu lang. Und ich hätte klarstellen sollen, dass ich hier nicht auf die eigentliche Frage antworte. – rfmodulator

+0

Zum Down-Abstimmung, würden Sie bevorzugen, dass ich das einfach löschen? Fühlst du nicht, dass es eine wichtige Kritik am Beispielcode ist? – rfmodulator

Verwandte Themen