基于带标志的枚举的MultiSelect WPF ComboBox / ListBox

所以我可能会稍微推动界限……

基本上我有以下枚举,用C#代码声明:

[Flags] public enum FlaggedEnum : int { Option1 = 1, Option2 = 2, Option3 = 4, Option4 = 8, ... Option16 = 32768, None = 0 } 

此枚举是我已成功绑定到DataGrid对象的对象的成员。 成功意味着我已成功绑定所有其他字段。 🙂

我想要实现的是一个控件,其中检查上面所有适当的选项,其行为和行为类似于ComboBox / ListBox。 因此,您单击该字段并弹出一个下拉菜单,可以“检查”所需的任何选项。

控件还必须能够从枚举中读取并编写枚举。

我是一个WPF新手,所以我不知道在哪里可以创建一个ComboBox并绑定到列…任何帮助将不胜感激!

我有办法可行。 我不相信 – 我在网上找到了这种方法,忘了保存地址。

在我的项目中,我需要将一些复选框绑定到标志枚举。 为了帮助,我找到了一个简单的值转换器的实现,以方便双向绑定。 它不是通用的,并且转换器的单个实例一次只能与一个目标(意味着一个值的一个实例及其复选框组)一起工作。 转换器使用存储的值引用作为转换的方式,因此如果您尝试在单独的对象实例之间重用它,它将无法工作。 也就是说,这是我对这样的东西的唯一用途,它就像一个魅力。

转换器:

 ///  /// Provides for two way binding between a TestErrors Flag Enum property and a boolean value. /// TODO: make this more generic and add it to the converter dictionary if possible ///  public class TestActionFlagValueConverter : IValueConverter { private TestErrors target; public TestActionFlagValueConverter() { } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { TestErrors mask = (TestErrors)parameter; this.target = (TestErrors)value; return ((mask & this.target) != 0); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { this.target ^= (TestErrors)parameter; return this.target; } } 

在xaml中,它因此被使用:

     

在您的情况下,您可以将它放入您的datacell模板中(尽管显然您可能更喜欢使用combobox而不是简单的堆栈面板。确保将转换器实例化到靠近您的复选框组容器以确保它们有自己的转换器实例。

编辑:

在这里,我做了一个小测试项目来演示在带有datagrid的combobox中使用它,它基于默认的WPF应用程序 - 只需确保引用WPF工具包。

这是Window1.xaml文件:

                            

这是Window1.xaml.cs文件代码隐藏。

 using System; using System.Globalization; using System.Windows; using System.Windows.Data; namespace FlagEnumTest { ///  /// Interaction logic for Window1.xaml ///  public partial class Window1 : Window { public Window1() { InitializeComponent(); } } [Flags] public enum TestErrors { NoError = 0x0, PowerFailure = 0x1, OpenCondition = 0x2, } public class TestObject { public TestErrors Errors { get; set; } } ///  /// Provides for two way binding between a TestErrors Flag Enum property and a boolean value. /// TODO: make this more generic and add it to the converter dictionary if possible ///  public class TestErrorConverter : IValueConverter { private TestErrors target; public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { TestErrors mask = (TestErrors)parameter; this.target = (TestErrors)value; return ((mask & this.target) != 0); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { this.target ^= (TestErrors)parameter; return this.target; } } } 

默认情况下,datagrid将创建自己的列表示以及我强制的模板表示,因此您可以看到文本表示以及复选框1。 标志枚举会混淆默认文本表示,但您仍然可以看到绑定正常工作(检查两者,然后取消选中最后检查的那个 - 字符串值更改为另一个,而不是0)。