确定在GridViewRowPresenter中调用SelectTemplate的单元格

时间:2013-11-06 00:50:46

标签: wpf

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

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

有没有人对如何实现这一点有任何建议?有没有办法在SelectTemplate调用中确定有问题的Cell?

1 个答案:

答案 0 :(得分: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>