私にはうまくいくかもしれない方法があります。私はこれを信用していません-私はこの方法をウェブ上で見つけ、アドレスを保存するのを忘れました。
私のプロジェクトでは、いくつかのチェックボックスをフラグ列挙型にバインドする必要がありました。助けるために、私は双方向バインディングを容易にするための単純な値コンバーターの実装を見つけました。これは一般的なものではなく、コンバーターの単一のインスタンスは、一度に1つのターゲット(つまり、値の1つのインスタンスとそのチェックボックスのグループ)でのみ機能します。コンバーターは、値への保存された参照を逆変換する方法として使用するため、別々のオブジェクトインスタンス間で値を再利用しようとしても、機能しません。とは言うものの、これは私がこのようなものに持っていた唯一の用途であり、それは魅力のように機能しました。
コンバーター:
/// <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ではなくもう一方に変更されます)。