2013-10-18 2 views
1

ItemsControlDataTemplate이 표시되어 있습니다. 제 질문은 어떻게 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. 아주 간단 첫째로 당신의 N 일치하는 AlternationCount을 설정합니다. 제 경우에는 한 줄에 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> 
    
  3. 승리

0

, 그때는 다른 유형의 각 그들 설정없이 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에

당신은 더 DataTemplateSelector Class에서 찾을 수 있습니다

MSDN의 페이지

0

나는 이것을하는 3 가지 방법을 생각할 수 있습니다.

첫번째 방법

당신이 템플릿에 원하는 것들에 간단한 속성을 가지고, 다음

2 해당 속성 방식에 따라 올바른 템플릿을 선택하는 TemplateSelector이

또는 당신은을 사용할 수 있습니다 TemplateSelector 및 ItemContainerGenerator.IndexFromContainer의 조합을 사용하여 TemplateSelector의 컨테이너 및 항목을 사용하여 인덱스를 가져 와서 올바른 DataTemplate을 반환하십시오.

3rd way

또 다른 아이디어는 ValueConverter/MarkupExtension의 사용에있을 수 있습니다.

당신이

항목 [0]과 같은 MultiValueConverter 설치 뭔가해야 할 수도 있습니다 : DataTemplate을 표준 자원 항목 [1] : 대체 DataTemplate을 자원 항목 [2] : 목록 상자 (상대 소스 조회를) Item [3] : 목록 상자 항목 (상대 소스 조회)

그런 다음 ItemContainerGenerator.IndexFromContainer를 사용하고 인덱스와 일치하는 DataTemplate을 반환하면됩니다.

나는 이런 식으로 한 번했습니다. 나는이 코드에 생각 : http://www.codeproject.com/Articles/30021/WPF-Sticky-Notes-ListBox

관련 문제