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属性的复选框,以便它们排列在一个漂亮的网格中?
外部列表将是每一行,内部列表将是行的每一列.
看到这个问题。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 属性,它看起来像这样
