2012-04-08 80 views
2

我有标志枚举这样说 -绑定标志枚举包含列表框复选框

[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个值(因此这意味着在UI上有20个复选框),所以我无法承受在我的UI上存在太多复选框。

我试过使用MultiBindingConverter但在ConvertBack方法失败。 我想将复选框的状态与属性SelectedDepartments绑定。如果属性值为“A | B”,则应检查A和B复选框,而C和D应保持未选中状态。

回答

1

我不认为有没有办法做到这一点,而不使用一些代码隐藏。

我把你挂到上面的示例的解决方案,取消了所有从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); 
      } 
     } 
    } 

这方法完成了创建所有复选框的工作,每个复选框对应于None之外的每个指定的枚举常量。然后,我可以在Department enum中添加更多的部门,重新运行解决方案并查看新增部门的其他复选框。

我不得不对这个解决方案进行一些进一步的细微修改以使其完全工作。您可能需要也可能不需要对代码进行这些更改。首先,我制作了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> 

(基本上,我包裹在另一个的StackPanel现有DepartmentsPanel和移动的“原始值”显示到这个外的StackPanel。)最后,我设置整个MainWindow的DataContext,而不是DepartmentsPanel的DataContext,到创建的DataObject。这一步对于使'原始价值'显示工作是必要的。