2010-06-07 41 views
3

Silverlight不支持ItemsControl中的交替項目模板。我對於如何實現這一點有一些想法,但爲了避免污染潛在的答案,我會把它們排除在外。帶交替項目模板的Silverlight ItemsControl

這個想法與普通的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

我會在Item ViewModel類中放入一個Bool屬性,並在ItemTemplate上寫入DataTrigger以給出不同的外觀。 在集合中,我們可以循環並設置適當的布爾

+0

嗨Jobi 謝謝你,我更新的問題更清晰。我不希望這個解決方案依靠VM來運行。 – 2010-06-07 16:44:51

+2

ViewModel決不應該決定數據的呈現方式 – 2010-10-07 18:57:33

+1

即使虛擬機的整個觀點有點誤稱,也是要確定數據的呈現方式。代表Visiblity的布爾值,代表狀態的枚舉,它總是發生。 – 2010-12-02 09:51:47

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/

菲爾

附:對不起,明目張膽的自我推銷:)

相關問題