2010-06-07 6 views
3

Silverlight는 ItemsControl에서 대체 항목 템플릿을 지원하지 않습니다. 이 작업을 수행하는 방법에 대한 몇 가지 아이디어가 있지만 잠재적 인 답변을 오염시키지 않으려면이를 제외 시키십시오.Silverlight Items Control with Alternating ItemTemplate

아이디어는 작동하는 바운드 데이터 컨텍스트의 어떤 것도 의존하지 않는다는 점에서 일반 ItemTemplate과 같습니다. 뷰에 남아있는 기능을 원합니다 (MVVM으로 가정)

ItemsControl에 대해 템플릿을 교대로 제공하는 방법을 설계해야한다면 (전체 데이터 템플릿을 의미 함) 어떻게 수행 할 것입니까?

답변

3

연장 ItemsControl 및 PrepareContainerForItemOverride 무시에서 대체 템플릿을 적용 할 수 있습니다.

 protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 
     if (!object.ReferenceEquals(element, item)) 
     { 
      ContentPresenter presenter = element as ContentPresenter; 
      ContentControl control = null; 
      if (presenter == null) 
      { 
       control = element as ContentControl; 
       if (control == null) 
       { 
        return; 
       } 
      } 
      DataTemplate itemTemplate = null; 
      if ((this.ItemTemplate != null) && (this.DisplayMemberPath != null)) 
      { 
       throw new InvalidOperationException("Cannot set ItemTemplate and DisplayMemberPath simultaneously"); 
      } 
      if (!(item is UIElement)) 
      { 
       if (this.ItemTemplate != null) 
       { 
        if(this.AlternateItemTemplate != null && ((alternationIndex % 2)) == 1) 
         itemTemplate = this.AlternateItemTemplate; 
        else 
        itemTemplate = this.ItemTemplate; 
        alternationIndex++; 
       } 
      } 
      if (presenter != null) 
      { 
       if (itemTemplate != null) 
       { 
        presenter.Content = item; 
        presenter.ContentTemplate = itemTemplate; 
       } 
       else 
       { 
        presenter.SetBinding(ContentControl.ContentProperty, new Binding(this.DisplayMemberPath)); 
       } 
      } 
      else 
      { 
       control.Content = item; 
       control.ContentTemplate = itemTemplate; 
      } 
     } 
    } 

내가 alternationIndex을 사용하고 방법은 매우 정확하지 않습니다 변경 될 필요가 있지만 그렇지 않으면이 작동합니다.

1

Bool 속성을 Item ViewModel 클래스에 넣고 DataTrigger를 ItemTemplate에 쓰면 모양이 달라집니다. 컬렉션에서 우리는 루프를 통해 적절하게 그 부울을 설정할 수 있습니다.

+0

안녕하세요 Jobi 고마워, 내가 명확하게 질문을 업데이 트되었습니다. 이 솔루션이 VM의 기능에 의존하기를 원하지 않습니다. –

+2

ViewModel은 데이터가 표시되는 방법을 결정해서는 안됩니다. –

+1

VM의 전체 점으로 표시된 약간의 잘못된 점은 데이터 표시 방법을 결정하는 것입니다. Visibility를 나타내는 부울, 상태를 나타내는 enum은 항상 발생합니다. –

3

나는 최근에 같은 문제에 봉착했다. 나는 결국 연결된 속성이 갈 수있는 방법 결정,이 같은 다소 작동 기능을 결국 : 나는 여기에 대해 게시

<Grid x:Name="LayoutRoot" Background="White"> 
    <ListBox x:Name="ListItems"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Border> 
        <Border.Style> 
         <Style TargetType="Border"> 
          <Setter Property="Background" Value="White" /> 
         </Style> 
        </Border.Style> 
        <local:ItemsControlAlternation.AlternateStyle> 
         <Style TargetType="Border"> 
          <Setter Property="Background" Value="LightBlue" /> 
         </Style> 
        </local:ItemsControlAlternation.AlternateStyle> 
        <ContentPresenter Content="{Binding}" /> 
       </Border> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

: http://www.philsversion.com/2010/11/22/alternating-row-styles-in-silverlight/

추신 뻔뻔스러운 자기 승진에 대한 죄송 :)