我正在尝试使用GridViewRowPresenter作为TreeListView中的ItemsPresenter。问题是我希望能够在运行时为网格中的每个单元格确定DataTemplates。我一直在使用DataTemplateSelector来选择模板,但为了为正确的列选择正确的模板,我需要确定哪个列是SelectTemplate调用中的当前列。我一直在做的是假设按顺序调用SelectTemplate。换句话说,如果我有4列,第一个调用将是第一列,第二个调用是下一个,依此类推。所以我可以在ContentTemplateSelector中有一个DataTemplates列表,只需返回相应的模板,4次调用后重置索引并再次返回第一个模板。
这主要是有效的,但是,我发现在经过一定数量的行后,我再也不能指望对SelectTemplate的调用以一致的模式出现。
有没有人对如何实现这一点有任何建议?有没有办法在SelectTemplate调用中确定有问题的Cell?
答案 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>