Silverlight ItemsControl с альтернативным шаблоном элемента - PullRequest
3 голосов
/ 07 июня 2010

Silverlight не поддерживает шаблоны чередующихся элементов в ItemsControl. У меня есть несколько идей о том, как этого добиться, но чтобы не загрязнять потенциальные ответы, я их опущу.

Идея такая же, как у обычного ItemTemplate, в том, что он не будет зависеть ни от чего в связанном контексте данных для функционирования. Я хотел бы, чтобы функциональность оставалась в представлении (при условии MVVM)

Если бы вам пришлось разработать метод предоставления чередующихся шаблонов (а я имею в виду полный шаблон данных) для ItemsControl, как бы вы этого достигли?

Ответы [ 3 ]

3 голосов
/ 08 июня 2010

Расширьте 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, не очень точен и должен быть изменен, но в противном случае это должно работать.

3 голосов
/ 23 ноября 2010

Я недавно застрял на той же проблеме. В конце концов я решил, что присоединенные свойства - это путь, и в итоге получил функциональность, которая работает примерно так:

<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. Извините за откровенную саморекламу:)

1 голос
/ 07 июня 2010

Я бы поместил свойство Bool в класс ItemModel и написал бы DataTrigger на ItemTemplate, чтобы придать другой вид.В коллекции мы можем перебрать и установить это bool соответственно

...