2013-10-18 85 views
1

我有ItemsControl,关联的DataTemplate如下所示。我的问题是如何在ItemsControl中设置不同的第N个项目?我试图只在某些项目上放置边界。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

这可能会有所帮助:HTTP:// stackoverflow.com/questions/660528/how-to-display-row-numbers-in-a-listview – Damian

回答

0

我想它和它的很简单

  1. 首先设置符合您NAlternationCount。在我的情况下,我每行有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> 
    
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

可以更多地从DataTemplateSelector Class找出MSDN上的页面。

0

我可以想到3种方法。

1路

有你想要的模板的东西一个简单的属性,然后有一个TemplateSelector将基于该属性

第二个方式挑选正确的模板

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

第三条路

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

您可能需要有一个MultiValueConverter设置像这样

项[0]:的DataTemplate标准资源 第[1]:可替代的DataTemplate资源 第[2]:列表框(相对源查找) 项目[3]:listboxitem(相对源查找)

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

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