Как показать таблицу соединений в матрице с 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"/>