2012-04-08 7 views
2

Ich habe Enum Flagge sagen -Bind Flag Aufzählungen zu Listbox enthält Kontrollkästchen

[Flags] 
public enum Department 
{ 
    None = 0, 
    A = 1, 
    B = 2, 
    C = 4, 
    D = 8 
} 

Ich möchte Werte dieser Enumeration auf Sicht zeigen. Ich dachte daran, ein Listenfeld zu erstellen und seine Quelle an die Sammlung dieser Enumeration List<Department> Departments zu binden. Alle Werke so gut, bis ich daran dachte, eine Checkbox, die auf meinem Viewmodel auf eine Eigenschaft bindet -

public Department SelectedDepartments { get; set; } 

Die Lösung hier http://compilewith.net/2008/12/wpf-flagsenumvalueconverter.html für die Bindung ENUM-Werte zu Kontrollkästchen elegante Lösung bietet seinen aber eine Begrenzung der haben Ankreuzfelder Schaffung gleicher auf die Anzahl der Aufzählungswerte in der Liste. Aber in meinem Fall kann ich mir nicht leisten, so viele Checkboxen auf meinem UI zu haben, da meine Enum 20 Werte enthält (also 20 Checkboxen auf der Benutzeroberfläche haben).

Ich versuchte mit MultiBindingConverter, aber das schlägt in ConvertBack Methode. Ich möchte den Status von Kontrollkästchen mit der Eigenschaft SelectedDepartments binden. Sagen Sie, wenn der Eigenschaftswert "A | B" ist, dann sollte das Kontrollkästchen A und B aktiviert sein, während C und D nicht markiert sein sollten.

Antwort

1

Ich glaube nicht, dass es einen Weg gibt, dies zu tun, ohne Code-Behind zu verwenden.

ich die Probenlösung Sie oben verlinkten nahm, entfernt alle Kontrollkästchen aus MainWindow.xaml, fügte die folgende Methode MainWindow.xaml.cs und aus dem MainWindow Konstruktor aufgerufen:

private void AddCheckBoxes() 
    { 
     var converter = new FlagsEnumValueConverter(); 
     foreach (Department dept in Enum.GetValues(typeof(Department))) 
     { 
      if (dept != Department.None) 
      { 
       var binding = new Binding() 
       { 
        Path = new PropertyPath("Department"), 
        Converter = converter, 
        ConverterParameter = dept 
       }; 

       var checkBox = new CheckBox() { Content = dept.ToString() }; 
       checkBox.SetBinding(CheckBox.IsCheckedProperty, binding); 
       DepartmentsPanel.Children.Add(checkBox); 
      } 
     } 
    } 

Diese Methode erstellt alle Kontrollkästchen, eine für jede benannte Enum-Konstante abgesehen von None. Ich könnte dann weitere Abteilungen zur Department enum hinzufügen, die Lösung erneut ausführen und zusätzliche Kontrollkästchen für die neu hinzugefügten Abteilungen anzeigen.

Es gab ein paar weitere kleine Änderungen, die ich an dieser Lösung vornehmen musste, damit es vollständig funktionierte. Möglicherweise müssen Sie diese Änderungen an Ihrem Code vornehmen oder nicht. Erstens habe ich die DataObject Klasse implementieren INotifyPropertyChanged. Zweitens schrieb ich das XAML in MainWindow.xaml wie folgt:

<StackPanel> 
    <StackPanel x:Name="DepartmentsPanel" /> 
    <TextBlock Margin="5,20,0,0"> 
     <TextBlock Text="Raw Value:" FontWeight="Bold" /> 
     <TextBlock Text="{Binding Department}" /> 
    </TextBlock> 
</StackPanel> 

(Im Grunde habe ich die bestehenden DepartmentsPanel in einem anderen Stackpanel gewickelt und bewegt die Anzeige ‚Raw Value‘ in dieser äußeren Stackpanel.) Schließlich habe ich die DataContext des gesamten MainWindow, anstatt den DataContext der DepartmentsPanel, erstellt zu DataObject. Dieser Schritt war notwendig, damit die Anzeige "Raw Value" funktioniert.