我有一个ItemsControl
,其关联DataTemplate
如下所示。 我的问题是我怎样才能以不同的方式设置ItemsControl
中的第 N 项?我试图只在某些项目上放置边框。
<DataTemplate x:Key="CTemplate">
<Grid HorizontalAlignment="Left" Width="200" Height="Auto" Margin="0,0,30,30">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Vertical" Grid.Column="0">
<TextBlock Text="Device Name:" Style="{StaticResource i2_TB}"/>
<TextBlock Text="Device ID:" Style="{StaticResource i2_TB}" />
</StackPanel>
<StackPanel Orientation="Vertical" Grid.Column="2">
<TextBlock Text="{Binding DeviceName}" Style="{StaticResource i2_TB}" TextTrimming="CharacterEllipsis" />
<TextBlock Text="{Binding DeviceID}" Style="{StaticResource i2_TB}" TextTrimming="CharacterEllipsis" />
</StackPanel>
</Grid>
</DataTemplate>
我想通了,它非常简单
-
首先设置一个与您的
N
相匹配的AlternationCount
。就我而言,我每行有 3 个项目,我希望第 3 个项目不同。<ItemsControl ItemTemplate="{StaticResource CTemplate}" AlternationCount="3">
其次,在 模板本身中设置数据触发器,使用
AlternationIndex
作为数据触发器<DataTemplate.Triggers> <Trigger Property="ItemsControl.AlternationIndex" Value="2"> <Setter Property="BorderThickness" Value="0,0,0,1" TargetName="controlHost"/> </Trigger> </DataTemplate.Triggers>
赢
我可以想到 3 种方法。
第一种方式
对你想要模板的东西有一个简单的属性,然后有一个模板选择器,它将根据该属性选择正确的模板
第二种方式
或者,您可以使用 TemplateSelector 和ItemContainerGenerator.IndexFromContainer 的组合,其中使用 TemplateSelector 中的容器和项来获取索引并返回正确的 DataTemplate
第三种方式
或者另一个想法可能在于使用ValueConverter/MarkupExtension。
您可能需要设置这样的多值转换器
项目[0] : 数据模板标准资源项目[1] : 替代数据模板资源项目[2] : 列表框(相对源查找)项目[3]:列表框项(相对源查找)
然后,您可以使用 ItemContainerGenerator.IndexFromContainer,然后只返回与索引匹配的 DataTemplate。
我曾经做过这样的事情。我认为它在这个代码中:http://www.codeproject.com/Articles/30021/WPF-Sticky-Notes-ListBox
如果您的项目属于不同的类型,那么只需提供一个没有为每种不同类型的x:Key
值设置DataTemplate
即可:
<DataTemplate DataType="{x:Type DataTypes:ThisType}">
...
</DataTemplate>
<DataTemplate DataType="{x:Type DataTypes:ThatType}">
...
</DataTemplate>
但是,如果您的项目都是同一类型,则执行此操作的标准方法是为您想要的每个不同外观创建一个命名DataTemplate
并使用 DataTemplateSelector
.在 DataTemplateSelector.SelectTemplate
方法中,您可以决定为每个项目显示哪个DataTemplate
:
public class TaskListDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null && item is Task)
{
Task taskitem = item as Task;
if (taskitem.Priority == 1) return element.FindResource(
"importantTaskTemplate") as DataTemplate;
else return element.FindResource("myTaskTemplate") as DataTemplate;
}
return null;
}
}
示例取自 MSDN 上的链接页面(如下)
您可以从 MSDN 上的"DataTemplateSelector
类"页找到详细信息。