2011-11-25 168 views
0

我需要为技术应用程序显示内存转储。每个字节(单元格)应该通过DataTemplate来定义,以显示其他信息(通过设置背景颜色,单个工具提示等突出显示)。我做了以下尝试:变量绑定路径

<DataTemplate x:Key="HexNumberTemplate"> 
    <Grid> 
     [...] 
     <TextBlock> 
     <TextBlock.Text> 
      <Binding Path="Cell[0].Value"> 
      <Binding.Converter> 
       [...] 
      </Binding.Converter> 
      </Binding> 
     </TextBlock.Text> 
     </TextBlock> 
    </Grid> 
    </DataTemplate> 

最后的结果应该是这样的:
Dump example

我的问题是修复编码绑定路径。 “单元格”是包含显示单元格的所有必要信息的对象列表。使用这种方法,我需要用Cell [0]到Cell [15]定义16次相同的DataTemplate。我绝对想避免这个!
我读了一个定义源代码中的DataTemplate的方法,我在该字符串中组装XAML并调用Markup.XamlReader.Load(MemoryStreamOfTheString)。但是在这里,我失去了Visual Studio IDE的舒适感。
是否可以在XAML中定义DataTemplate并使Cell-Object的索引器成为参数?

回答

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> 

然后设置类型此文件资源,并将其加载到串并简单地与每个单独更换Current_Cell在构建视图时从字符串加载模板之前,请使用单元格编号。 通过设置Grid的DataContext,您可以帮助您使用模板中的其他绑定(上下文已经设置为当前单元格,并且不需要将其替换到任何地方)。

我是在同样的情况最近,唯一的区别是,我有网完全动态列(从服务器加载),所以我甚至没有机会创造16个模板:)

+0

+1(简单)想法将其导出到另一个XAML以使IDE更加舒适。我没有提到的是,我有你未知的数量的列。这里通用内存布局的图片仅仅是为了简化SO的问题。 (如果问题太复杂,你不会得到任何答案。) – Markus

+0

我认为这是我想要在我的情况下去的方式。据我在这里阅读(http://support.microsoft.com/kb/319292),有必要将其设置为嵌入式资源。 – Markus

1

尝试使用ListBoxes。

外部ListBox也包含ListBox的行,每个行绑定到一个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; } 
+0

和唐忘了将outerListBoxItems列表ItemsPanel设置为水平对齐的模板StackPanel –

+0

啊!当然是。一个内部ListBox可以迭代单元格列表。感谢您的新想法。 – Markus

0

我会建议使用带有自定义头部和单元模板一列的DataGrid。 您的网格不会从单个单元格调整大小中获益,是吗?你的头文件将有固定数量的列,你的单元格模板可以实现为ListControl的一个子类 - 我们只需要将StackPanel的方向从垂直改为水平。然后,你的绑定对象将是一个字节的集合,这很容易,因为你的单元格控件是从ListControl派生的。

请让我们知道这是否合理。

1

您可以尝试使用Attached Behavior模式。您可以将附加属性绑定到列号,并且附加的行为会将文本绑定到给定列号的所需单元格。

+0

+1为非常有趣的链接。我想多花点时间思考一下。 – Markus