设置项目控件中第 N 项的样式



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

我想通了,它非常简单

  1. 首先设置一个与您的N相匹配的AlternationCount。就我而言,我每行有 3 个项目,我希望第 3 个项目不同。

    <ItemsControl ItemTemplate="{StaticResource CTemplate}" AlternationCount="3">
    
  2. 其次,在
  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类"页找到详细信息。

相关内容

  • 没有找到相关文章

最新更新