WPF中的复选框网格

Jos*_*ose 5 wpf grid itemscontrol

我有一个WPF UserControl的datacontext绑定到这样的类:

public class CheckBoxGridViewModel
{
  public List<List<bool>> Checkboxes {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我希望它显示一个复选框网格.我假设我可以使用Itemscontrol,但不知道如何使用每行的动态列集来完成它.

这个问题似乎回答了我的问题,除了答案没有给出这个例子,我无法想出如何写出来.

所以问题是,如何编写xaml以显示Checkboxes属性的复选框,以便它们排列在一个漂亮的网格中?

外部列表将是每一行,内部列表将是行的每一列.

Fre*_*lad 2

看到这个问题。Jobi Joy 的答案将让您呈现 2D 列表,但绑定不起作用,因此您无法编辑您的值。

为了能够绑定值,您可以使用像这样的帮助器类

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个方法使用这个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); } } 
}
Run Code Online (Sandbox Code Playgroud)

然后你可以为 ItemsControl 设置 ItemsSource

itemsControl.ItemsSource = BindableListHelper.GetBindable2DList<bool>(Checkboxes);
Run Code Online (Sandbox Code Playgroud)

并且编辑应该有效

使用与我链接的问题中的Jobi Joy相同的代码,您可以将 DataTemplate_Level2 中的 Button 更改为 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>
Run Code Online (Sandbox Code Playgroud)

如果不设置 CheckBox 的 Content 属性,它看起来像这样

替代文本