2

我有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>
4

3 回答 3

2

我想通了,它很简单

  1. 首先设置一个AlternationCount匹配你的N. 就我而言,我每行有 3 个项目,我希望第 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>
    
于 2013-10-18T15:20:27.207 回答
1

我可以想到 3 种方法来做到这一点。

第一种方式

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

第二种方式

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

第三种方式

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

您可能需要像这样设置 MultiValueConverter

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

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

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

于 2013-10-18T13:50:32.653 回答
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 上的DataTemplateSelectorClass页面了解更多信息。

于 2013-10-18T13:15:00.343 回答