所以我可能会稍微突破界限...
基本上我有以下用C#代码声明的枚举:
[Flags]
public enum FlaggedEnum : int
{
Option1 = 1,
Option2 = 2,
Option3 = 4,
Option4 = 8,
...
Option16 = 32768,
None = 0
}
此枚举是我已成功绑定到DataGrid对象的对象的成员。成功意味着我已经成功绑定了所有其他领域。 :)
我想在这里实现的是一个控件,其中选中了上面所有适当的选项,其行为和行为类似于ComboBox / ListBox。因此,您单击该字段,将弹出一个下拉菜单,可以“检查”所需的任何选项。
控件还必须能够从枚举中读取并编写枚举。
我是WPF的新手,所以我不知道除了创建ComboBox和绑定到列之外还有什么地方...任何帮助将不胜感激!
我有一种可行的方法。我对此一无所获-我在网上找到了这种方法,却忘记了保存地址。
在我的项目中,我需要将几个复选框绑定到一个标记枚举。为了帮助您,我找到了一个简单的值转换器的实现方式,以简化双向绑定。它不是通用的,并且转换器的单个实例一次只能与一个目标(即一个值的一个实例及其一组复选框)一起使用。转换器使用存储的对该值的引用作为回溯的一种方式,因此,如果您尝试在单独的对象实例之间重用它,则将无法使用。就是说,这是我对这种东西的唯一用途,并且它就像一种魅力。
转换器:
/// <summary>
/// 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
/// </summary>
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中使用:
<StackPanel.Resources>
<local:TestActionFlagValueConverter x:Key="TestActionFlagValueConverter"/>
</StackPanel.Resources>
<CheckBox IsChecked="{Binding Errors, Converter={StaticResource TestActionFlagValueConverter}, ConverterParameter={x:Static local:TestErrors.PowerFailure}...
<CheckBox IsChecked="{Binding Errors, Converter={StaticResource TestActionFlagValueConverter}, ConverterParameter={x:Static local:TestErrors.OpenCondition}...
[在您的情况下,您可以将其放入数据单元格模板中(尽管显然,您可能更喜欢使用组合框而不是简单的堆栈面板。请确保在靠近复选框组容器的位置实例化转换器,以确保它们具有自己的实例”)。转换器。
编辑:
[这里,我做了一个小测试项目,以在带有数据网格的组合框中演示如何使用它,它基于默认的WPF应用程序-只要确保引用WPF工具箱即可。
这是Window1.xaml文件:
<Window x:Class="FlagEnumTest.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" xmlns:FlagEnumTest="clr-namespace:FlagEnumTest" Title="Window1" Height="300" Width="300"> <Window.Resources> <x:Array Type="{x:Type FlagEnumTest:TestObject}" x:Key="TestArray"> <FlagEnumTest:TestObject Errors="OpenCondition" /> <FlagEnumTest:TestObject /> </x:Array> </Window.Resources> <StackPanel> <Controls:DataGrid ItemsSource="{Binding Source={StaticResource TestArray}}"> <Controls:DataGrid.Columns> <Controls:DataGridTemplateColumn Header="Errors"> <Controls:DataGridTemplateColumn.CellTemplate> <DataTemplate> <ComboBox> <ComboBox.Resources> <FlagEnumTest:TestErrorConverter x:Key="ErrorConverter" /> </ComboBox.Resources> <CheckBox Content="PowerFailure" IsChecked="{Binding Path=Errors, Converter={StaticResource ErrorConverter}, ConverterParameter={x:Static FlagEnumTest:TestErrors.PowerFailure}}" /> <CheckBox Content="OpenCondition" IsChecked="{Binding Path=Errors, Converter={StaticResource ErrorConverter}, ConverterParameter={x:Static FlagEnumTest:TestErrors.OpenCondition}}" /> </ComboBox> </DataTemplate> </Controls:DataGridTemplateColumn.CellTemplate> </Controls:DataGridTemplateColumn> </Controls:DataGrid.Columns> </Controls:DataGrid> </StackPanel> </Window>
这是Window1.xaml.cs文件的代码隐藏。
using System; using System.Globalization; using System.Windows; using System.Windows.Data; namespace FlagEnumTest { /// <summary> /// Interaction logic for Window1.xaml /// </summary> 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; } } /// <summary> /// 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 /// </summary> 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; } } }
默认情况下,数据网格将创建其自己的列表示形式以及我指定的模板化表示形式,因此您可以看到文本表示形式以及复选框。标志枚举使默认的文本表示感到困惑,但是您仍然可以看到绑定正常工作(选中两个,然后取消选中您上次检查的那个-字符串值更改为另一个,而不是0)。
我创建了一个IValueConverter,它支持直接绑定到枚举,而无需代码隐藏或帮助程序类。它只有两个限制: