变量绑定路径

时间:2011-11-25 08:23:17

标签: wpf xaml binding

我需要为技术应用程序显示内存转储。应通过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'是一个对象列表,其中包含显示单元格所需的所有信息。使用这种方法,我需要使用Cell [0]到Cell [15]定义相同DataTemplate的16倍。我当然希望避免这种情况! 我读了一个在源代码中定义DataTemplate的方法,我在一个字符串中组装XAML并调用Markup.XamlReader.Load( MemoryStreamOfTheString )。但在这里我失去了Visual Studio IDE的舒适度 是否可以在XAML中定义DataTemplate并使Cell-Object的索引器成为参数?

4 个答案:

答案 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派生的。

如果有意义,请告诉我们。