См. этот вопрос .Ответ от Jobi Joy позволит вам представить 2D-список, но Binding не будет работать, поэтому вы не сможете редактировать свои значения.
Чтобы иметь возможность связывать значения, вы можете использовать вспомогательный класс, подобный этому
public static class BindableListHelper
{
public static List<List<Ref<T>>> GetBindable2DList<T>(List<List<T>> list)
{
List<List<Ref<T>>> refInts = new List<List<Ref<T>>>();
for (int i = 0; i < list.Count; i++)
{
refInts.Add(new List<Ref<T>>());
for (int j = 0; j < list[i].Count; j++)
{
int a = i;
int b = j;
refInts[i].Add(new Ref<T>(() => list[a][b], z => { list[a][b] = z; }));
}
}
return refInts;
}
}
Этот метод использует этот класс Ref
public class Ref<T>
{
private readonly Func<T> getter;
private readonly Action<T> setter;
public Ref(Func<T> getter, Action<T> setter)
{
this.getter = getter;
this.setter = setter;
}
public T Value { get { return getter(); } set { setter(value); } }
}
Затем вы можете установить ItemsSourceдля ItemsControl с
itemsControl.ItemsSource = BindableListHelper.GetBindable2DList<bool>(Checkboxes);
и редактирование должно работать
Используя тот же код, что и Jobi Joy из вопроса, который я связал, вы можете изменить Button в DataTemplate_Level2вместо CheckBox и связать IsChecked для него вместо Value (поскольку в противном случае он будет указывать на класс Ref)
<Window.Resources>
<DataTemplate x:Key="DataTemplate_Level2">
<CheckBox IsChecked="{Binding Path=Value}" Height="15" Width="15" Margin="2"/>
</DataTemplate>
<DataTemplate x:Key="DataTemplate_Level1">
<ItemsControl ItemsSource="{Binding}" ItemTemplate="{DynamicResource DataTemplate_Level2}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
</Window.Resources>
<StackPanel>
<Border HorizontalAlignment="Left" BorderBrush="Black" BorderThickness="2">
<ItemsControl x:Name="itemsControl" ItemTemplate="{DynamicResource DataTemplate_Level1}"/>
</Border>
</StackPanel>
Без установки свойства Content для CheckBox он будет выглядеть примерно так