1

我正在尝试使用 GridViewRowPresenter 作为 TreeListView 中的 ItemsPresenter。问题是我希望能够在运行时确定网格中每个单元格的 DataTemplates。我一直在使用 DataTemplateSelector 来选择模板,但为了为正确的列选择正确的模板,我需要确定在调用 SelectTemplate 时哪一列是当前列。我一直在做的是假设 SelectTemplate 被顺序调用。换句话说,如果我有 4 列,第一次调用将针对第一列,第二列针对下一列,依此类推。所以我可以在 ContentTemplateSelector 中有一个 DataTemplates 列表并简单地返回适当的模板,在 4 次调用后重置索引并再次返回第一个模板。

这主要是有效的,但是,我发现在一定数量的行之后,我不能再指望对 SelectTemplate 的调用以一致的模式出现。

有人对如何实现这一目标有任何建议吗?有没有办法在 SelectTemplate 调用中确定有问题的单元格?

4

1 回答 1

0

我一直在玩 WPF DataGrid,我需要做类似的事情。我尝试在 XAML 中完成大部分工作,但您当然也可以在代码隐藏中完成。

就我而言,我想根据正在显示的数据中的信息为 DataGrid 中的每个单元格选择一个模板。我的 DataGrid 显示了全部放在一起以创建串行命令的数据块。我希望能够根据每个“SerialBlock”包含的数据类型选择编辑/显示模板。

public class ColumnTemplateSelector : DataTemplateSelector
{
    public DataTemplate ColorTemplate { get; set; }
    public DataTemplate RawBytesTemplate { get; set; }
    public DataTemplate AddressTemplate { get; set; }
    public DataTemplate CommandTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {

        SerialBlock command = item as SerialBlock;
        if (null != command)
        {
            switch (command.BlockType)
            {
                case EnumBlockType.Address:
                    return AddressTemplate;
                case EnumBlockType.Color:
                    return ColorTemplate;
                case EnumBlockType.Command:
                    return CommandTemplate;
                case EnumBlockType.RawBytes:
                    return RawBytesTemplate;

            }
        }
        return base.SelectTemplate(item, container);

    }

}

在 XAML 中,我使用以下内容创建列...(我还有几个)

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplateSelector>
        <src:ColumnTemplateSelector 
            ColorTemplate="{StaticResource ColorEditTemplate}"
            AddressTemplate="{StaticResource AddressEditTemplate}"
            RawBytesTemplate="{StaticResource RawBytesEditTemplate}"
            CommandTemplate="{StaticResource CommandEditTemplate}">
        </src:ColumnTemplateSelector>
    </DataGridTemplateColumn.CellTemplateSelector>
</DataGridTemplateColumn>

然后我创建这样的模板......(当然,我还有几个)

    <DataTemplate x:Key="AddressTemplate">
        <Border Padding="3" Background="Green">
            <TextBlock Text="{Binding Path=BlockText}" />
        </Border>
    </DataTemplate>
    <DataTemplate x:Key="AddressEditTemplate">
        <Border Padding="3" Background="Green">
            <TextBlock Text="{Binding Path=BlockText}" />
        </Border>
    </DataTemplate>
于 2013-11-06T01:45:56.057 回答