在ItemsControl中设置第N项

时间:2013-10-18 12:48:06

标签: wpf xaml styles datatemplate

我有一个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>

3 个答案:

答案 0 :(得分:1)

我可以想到3种方法。

第一路

在你想要模板的东西上有一个简单的属性,然后有一个TemplateSelector,它将根据该属性选择正确的模板

第二路

或者您可以使用TemplateSelector和ItemContainerGenerator.IndexFromContainer的组合,在其中使用TemplateSelector中的容器和项来获取索引并返回正确的DataTemplate

第三种方式

或者另一个想法可能在于使用ValueConverter / MarkupExtension。

您可能需要设置类似这样的MultiValueConverter

Item [0]:DataTemplate标准资源 Item [1]:Alternative DataTemplate资源 Item [2]:列表框(相对源查找) Item [3]:listboxitem(相对源查找)

然后你可以使用ItemContainerGenerator.IndexFromContainer,然后只返回与索引匹配的DataTemplate。

我做过一次这样的事。我认为这是在这段代码中: http://www.codeproject.com/Articles/30021/WPF-Sticky-Notes-ListBox

答案 1 :(得分:1)

我想通了,非常简单

  1. 首先设置与AlternationCount匹配的N。在我的情况下,我每行有3个项目,我希望第三个项目不同。

    <ItemsControl ItemTemplate="{StaticResource CTemplate}" AlternationCount="3">
    
  2. 其次,使用AlternationIndex作为数据触发器在模板中设置数据触发器

    <DataTemplate.Triggers>
        <Trigger Property="ItemsControl.AlternationIndex" Value="2">
            <Setter Property="BorderThickness" Value="0,0,0,1" TargetName="controlHost"/>
        </Trigger>
    </DataTemplate.Triggers>
    

答案 2 :(得分:0)

如果您的商品属于不同类型,那么就可以轻松为每种不同类型提供DataTemplate 而不设置x:Key

<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 Class页面上找到更多信息。