0

私は2つの列挙型を持っています:

public enum MyEnumA
{
    OptionA1 = 1,
    OptionA2 = 2,
    OptionA3 = 3,
}

public enum MyEnumB
{
    OptionB1 = 1,
    OptionB2 = 2,
    OptionB3 = 3,
}

および両方の列挙型を含むクラス

public class AB
{
    public MyEnumA A { get; set; }
    public MyEnumB B { get; set; }
}

両方の列挙型のチェックボックスのマトリックスが必要です。データはリストから読み取られ、リストに保存されます。このリストは実際のジャンクションテーブルです。とりあえず、手作業でリストに記入しました。

    private List<AB> ABList = new List<AB>();

    ABList.Add(new AB { A = MyEnumA.OptionA2, B = MyEnumB.OptionB1 });
    ABList.Add(new AB { A = MyEnumA.OptionA3, B = MyEnumB.OptionB3 });

マトリックスは次のようになります。

            OptionA1 OptionA2 OptionA3
OptionB1                 X
OptionB2
OptionB3                          X

すべてがコードビハインドで行われるWinFormソリューションを見つけました:http ://social.msdn.microsoft.com/Forums/eu/winformsdatacontrols/thread/33fae605-902a-40e3-9bbb-60b77fc33b9bしかし、それはできませんデータバインディングを使用してxamlで実行しますか?

4

2 に答える 2

1

データバインディングでWPFDataGridを使用する場合は、データを変換する以外に方法はありません。

        public MainWindow()
    {
        InitializeComponent();

        DataContext = Enum.GetValues(typeof(MyEnumB)).Cast<MyEnumB>().Select(b => new ABViewModel() { Name = b.ToString(), A1 = ABList.Any(ab => ab.B == b && ab.A == MyEnumA.OptionA1), A2 = ABList.Any(ab => ab.B == b && ab.A == MyEnumA.OptionA2), A3 = ABList.Any(ab => ab.B == b && ab.A == MyEnumA.OptionA3) }).ToList();
    }


public class ABViewModel
{
    public string Name { get; set; }
    public bool A1 { get; set; }
    public bool A2 { get; set; }
    public bool A3 { get; set; }
}

Xamlは今では簡単です:

<DataGrid ItemsSource="{Binding}" IsReadOnly="True"/>
于 2012-11-08T07:35:56.010 に答える
1

解決策をありがとう、Grafix。とてもいいです。コンバーターに配置する方がいいと思ったので、次のようにしました。

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var abList = value as List<AB>;

        if (abList == null)
            return null;

        var retVal = Enum.GetValues(typeof (MyEnumB)).Cast<MyEnumB>().Select(
                b =>
                new ABViewModel()
                    {
                        Name = b,
                        OptionA1 = abList.Any(ab => ab.B == b && ab.A == MyEnumA.OptionA1),
                        OptionA2 = abList.Any(ab => ab.B == b && ab.A == MyEnumA.OptionA2),
                        OptionA3 = abList.Any(ab => ab.B == b && ab.A == MyEnumA.OptionA3)
                    }).ToList();
        return retVal;
    }

そしてDataGrid:

    <DataGrid Height="215" HorizontalAlignment="Left" Margin="91,12,0,0" Name="dataGrid1" 
            VerticalAlignment="Top" Width="299" 
            ItemsSource="{Binding ABList, Converter={StaticResource listToDataTableConverter}}"
            d:DataContext="{d:DesignData }" />

そして、DataContextを次のように設定します。

    public MainWindow()
    {
        InitializeComponent();

        ABList.Add(new AB { A = MyEnumA.OptionA2, B = MyEnumB.OptionB1 });
        ABList.Add(new AB { A = MyEnumA.OptionA3, B = MyEnumB.OptionB3 });

        DataContext = this;
    }
于 2012-11-09T12:44:12.333 に答える