2010-06-07 70 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/

菲尔

附:对不起,明目张胆的自我推销:)