我需要为技术应用程序显示内存转储。应通过DataTemplate定义每个字节(单元格)以显示其他信息(通过设置背景颜色,单个工具提示等突出显示)。我做了以下尝试:
<DataTemplate x:Key="HexNumberTemplate">
<Grid>
[...]
<TextBlock>
<TextBlock.Text>
<Binding Path="Cell[0].Value">
<Binding.Converter>
[...]
</Binding.Converter>
</Binding>
</TextBlock.Text>
</TextBlock>
</Grid>
</DataTemplate>
最终结果应如下所示:
我的问题是修复编码的绑定路径。 'Cell'是一个对象列表,其中包含显示单元格所需的所有信息。使用这种方法,我需要使用Cell [0]到Cell [15]定义相同DataTemplate的16倍。我当然希望避免这种情况! 我读了一个在源代码中定义DataTemplate的方法,我在一个字符串中组装XAML并调用Markup.XamlReader.Load( MemoryStreamOfTheString )。但在这里我失去了Visual Studio IDE的舒适度 是否可以在XAML中定义DataTemplate并使Cell-Object的索引器成为参数?
答案 0 :(得分:2)
你应该像读过一样:通过使用XamlReader加载它们来动态创建模板。为了使XAML编辑器更加舒适,您可以在单独的xaml文件中定义模板,如下所示:
<DataTemplate
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid DataContext="{Binding Current_Cell}">
<!--Your template controls goes here.-->
</Grid>
</DataTemplate>
然后将此文件的类型设置为Resource,并将其加载到字符串中,只需在构建视图时从字符串加载模板之前将Current_Cell替换为每个单独的单元格编号。 通过设置Grid的DataContext,您可以自己在模板中使用其他绑定(上下文已经设置为当前单元格,您无需在任何地方替换它)。
我最近处于相同的情况,唯一的区别是,我的网格有完全动态的列(从服务器加载),所以我甚至没有机会创建16个模板:)
答案 1 :(得分:1)
使用ListBoxes尝试。
外部ListBox也包含ListBoxes的行,每个行绑定到List对象。您可以创建ListBoxItems的DataTemplate。
<DataTemplate x:Key="innerListBoxItem">
[...]
<TextBlock Text="{Binding Value}" />
[...]
<DataTemplate>
<DataTemplate x:key="outerListBoxItem">
<Grid>
<ListBox ItemTemplate="{StaticResource innerListBoxItem}" ItemCollection="{Binding Cells}"/>
</Grid>
<DataTemplate>
并且您想要放置此控件:
<ListBox ItemTemplate="{StaticResource outerListBoxItem}" ItemCollection={Binding CellsList}"/>
代码背后的代码:
public class ListOfCells { public List<Cell> Cells {get; set; } }
public List<ListOfCells> CellsList {get; private set; }
答案 2 :(得分:1)
您可以尝试使用Attached Behavior模式。您可以将附加属性绑定到列号,并且附加行为将文本绑定到给定列号的所需单元格。
答案 3 :(得分:0)
我建议使用单列DataGrid和自定义标题和单元格模板。 你的网格不会受益于单个细胞的大小调整,会吗?您的标题将具有固定数量的列,您的单元格模板可以实现为ListControl的子类 - 我们只需要将StackPanel的方向从垂直更改为水平。然后,绑定的对象将是一个字节集合,这很容易,因为您的单元格控件是从ListControl派生的。
如果有意义,请告诉我们。