我正在用C#构建一个简单的十六进制编辑器,我决定使用DataGrid中的每个单元来显示一个字节*。我知道DataGrid将获取一个列表并将列表中的每个对象显示为一行,并将该对象的每个属性显示为列。我想显示每行16个字节的行,这将需要一个包含16个字符串属性的包装器。虽然可行,但它并不是最优雅的解决方案。有没有更简单的方法?我已经尝试在大小为16的公共字符串数组周围创建一个包装器,但这似乎不起作用。
由于
*这个的基本原理是我可以在每个字节之间有空格,而不必在我想保存我编辑的文件时将它们全部删除。此外,似乎更容易标记行和列。
答案 0 :(得分:1)
我会考虑在ColumnDefinitions
和动态RowDefinitions
集合中创建一个包含16列的常规网格,并在每个单元格中放置无边框TextBox
。您需要重载一些键处理以使用户更容易在文本框之间导航,但DataGrid的单元格也需要类似的东西。
如果您仍想使用DataGrid,则将ItemsSource
指向16个大小的数组列表应该可以正常工作。从代码中创建16 DataGridTextColumns
。每个Binding = new Binding(string.Format("[{0}]", i))
,其中i
为0..15。索引属性只是另一个属性,您可以轻松绑定到它。这些不必是字符串数组:使用字节并在十六进制字符串和字节之间创建一个IValueConverter。哦,关掉AutoGenerateColumns
。
答案 1 :(得分:1)
我建议你使用MultiBinding。
<my:DataGrid ItemsSource="{Binding HexDataArray}">
<my:DataGrid.Columns>
<my:DataGridTemplateColumn>
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1} ...">
<Binding Path="Array[0]" />
<Binding Path="Array[1]" />
.........................
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</my:DataGridTemplateColumn.CellTemplate>
</my:DataGridTemplateColumn>
</my:DataGrid.Columns>
</my:DataGrid>