2012-04-08 3 views
2

У меня есть флаг перечисление говорят, что это -Bind Flag перечислений ListBox, содержащий флажки

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

Я хочу показать значения этого перечисления на просмотр. Я подумал о создании списка и привязывании его источника к коллекции этого перечисления List<Department> Departments. Все работает так хорошо, пока я не думал иметь флажок, который связывается со свойством на мой ViewModel -

public Department SelectedDepartments { get; set; } 

Решение здесь http://compilewith.net/2008/12/wpf-flagsenumvalueconverter.html обеспечивает элегантное решение для связывания значений перечислений для флажков, но его есть одно ограничение создания флажков равных к числу значений перечисления в списке. Но в моем случае я не могу позволить себе иметь так много флажков, лежащих на моем пользовательском интерфейсе, так как мой Enum содержит 20 значений (так что это означает наличие 20 флажков в пользовательском интерфейсе).

Я пробовал использовать MultiBindingConverter, но это не удалось в ConvertBack Метод. Я хочу связать состояние флажков с собственностью SelectedDepartments. Скажем, если значение свойства «A | B», тогда необходимо проверить флажок A и B, тогда как C и D должны оставаться непроверенными.

ответ

1

Я не думаю, что есть способ сделать это без использования кода.

Я принял решение образца вы связаны с выше, удаляются все CheckBoxes из MainWindow.xaml, добавил следующий метод MainWindow.xaml.cs и назвал его из MainWindow конструктора:

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); 
      } 
     } 
    } 

Этот метод выполняет работу по созданию всех флажков, по одному для каждой именованной переменной enum, отличной от None. Затем я мог бы добавить дополнительные подразделения в список Department, заново запустить решение и посмотреть дополнительные флажки для недавно добавленных отделов.

Были некоторые незначительные изменения, которые я должен был внести в это решение, чтобы заставить его работать полностью. Вы можете или не должны вносить эти изменения в свой код. Во-первых, я применил класс DataObject класса INotifyPropertyChanged. Во-вторых, я переписал код XAML в MainWindow.xaml следующим образом:

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

(В принципе, я обернул существующую DepartmentsPanel в другом StackPanel и переместили дисплей «Raw Value» в этот внешний StackPanel.) Наконец, я установил DataContext всего MainWindow, а не DataContext для DepartmentsPanel, для созданного DataObject. Этот шаг был необходим для работы дисплея «Сыроедение».

Смежные вопросы