2013-10-18 121 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