2010-06-07 2 views
3

Silverlight не поддерживает чередующиеся шаблоны элементов в ItemsControl. У меня есть несколько идей в отношении того, как это сделать, но чтобы не загрязнять потенциальные ответы, я их оставлю.Silverlight ItemsControl 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 в класс ItemModel Item и написал DataTrigger на ItemTemplate, чтобы дать другой взгляд. В сборнике мы можем прокрутить и установить, что bool соответственно

+0

Hi Jobi Спасибо за это, я обновил вопрос, чтобы быть более четким. Я не хочу, чтобы это решение зависело от работы виртуальной машины. –

+2

ViewModel никогда не должен определять, как данные представляются. –

+1

Это немного некорректно, поскольку вся точка виртуальной машины должна определить, как данные представлены. Булевы, представляющие Visiblity, перечисления, представляющие состояния, происходят все время. –

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/

Phil

P.S. Извините за откровенное самоопределение :)

Смежные вопросы