Как показать таблицу соединений в матрице с WPF?

У меня есть два перечисления:

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 с привязкой данных?

2 ответа

Решение

Спасибо за ваше решение, 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;
    }

Если вы хотите использовать WPF DataGrid с привязкой данных, я не вижу другого способа, кроме как преобразовать данные.

        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"/>
Другие вопросы по тегам