請參閱this question。 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;
}
}
此方法使用該參考類
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);
和編輯應該工作
使用相同的代碼苡樂從我掛的問題,您可以在DataTemplate_Level2改變按鈕,一個複選框並綁定器isChecked爲它而不是值(因爲它會指向參考類其他)
<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屬性的複選框,它會是這個樣子
![alt text](https://i.stack.imgur.com/AZdyl.png)
有人試圖編寫一個井字? :D – David 2010-12-21 11:05:12