我有int[40,40]
,包含1和0。
我想创建一个二维表40x40,这样绿色方块代表1,红色方块代表0。
我还想为每个单元格添加一个工具提示,并显示索引。
这样的事情:
我该怎么做?
答案 0 :(得分:3)
我会首先创建一个锯齿状数组(我不认为这是绑定到多维数组的好方法,因为它不是IEnumerable)。然后,您可以执行简单的2级嵌套项控件,例如:
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding Bits}">
<ItemsControl.Resources>
<converters:BoolToBrushConverter x:Key="BoolToBrush" TrueBrush="Green" FalseBrush="Red" />
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Width="10" Height="10"
Fill="{Binding Converter={StaticResource BoolToBrush}}"
Stroke="White" StrokeThickness="1"
/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
&#34; BoolToBrushConverter&#34;是IValueConverter
,它将true / false转换为绿色/红色画笔:
public class BoolToBrushConverter : IValueConverter
{
public Brush TrueBrush { get; set; }
public Brush FalseBrush { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((value as bool?).GetValueOrDefault(false) ? TrueBrush : FalseBrush);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
修改强>
我使用锯齿状数组bool[][]
对其进行了测试,并遇到了一些奇怪的行为 - 似乎运行时将每个嵌套的bool[]
转换为字符串。所以我创建了一个包装类&#34; BitArray&#34;,并制作了#34; Items&#34;类型BitArray[]
,它按预期工作。
public class BitArray
{
public bool[] Bits { get; set; }
public BitArray(params bool[] args)
{
Bits = args;
}
}
测试数据:
Items = new BitArray[]
{
new BitArray(true, false, true, true),
new BitArray(false, false, true, false),
new BitArray(false, true, true, false),
new BitArray(true, false, true, false),
};
编辑#2 请注意,由于您希望将索引显示为工具提示,因此我建议制作另一个包装类来保存内部bool以及当前(i,j)索引。
答案 1 :(得分:1)
工作很棒。 对于工具提示,我改变了一点,就像你说的那样。
这是最终代码
1位类
public class Bit
{
public string Index { get; set; }
public bool Value { get; set; }
}
1行(40位)的等级
public class BitsArray
{
public Bit[] Bits { get; set; }
public BitsArray()
{
Bits = new Bit[40];
for (int i = 0; i < 40; i++)
Bits[i] = new Bit();
}
}
最后是40x40阵列。
BitsArray[] MyBits= new BitsArray[40];
for (int i = 0; i < 40; i++)
MyBits[i] = new BitsArray();
xaml
<DataTemplate>
<Rectangle Width="10" Height="10"
Fill="{Binding Path=Value, Converter={StaticResource BoolToBrush}}"
ToolTip="{Binding Path=Index}" Stroke="White" StrokeThickness="1"/>
</DataTemplate>