Domanda

Silverlight non supporta alternata Modelli elemento in un ItemsControl. Ho un paio di idee in mente su come raggiungere questo obiettivo, ma per evitare di inquinare le potenziali risposte, li lascio fuori.

L'idea è la stessa di un ItemTemplate normale in quanto non dipenderà tutto ciò nel contesto dati associati alla funzione. Vorrei che la funzionalità di rimanere in vista (assumendo MVVM)

Se si dovesse progettare un metodo per fornire modelli alternati (e intendo un modello di dati completo) per un ItemsControl, come è possibile raggiungere questo obiettivo?

È stato utile?

Soluzione

Estendere ItemsControl e l'override PrepareContainerForItemOverride è possibile applicare i modelli di alternanza.

        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;
            }
        }
    }

Il modo in cui sto usando alternationIndex non è molto accurato e avrebbe bisogno di essere cambiato, ma per il resto questo dovrebbe funzionare.

Altri suggerimenti

Sono rimasto bloccato sullo stesso problema da poco. Alla fine ho deciso che proprietà associate sono la strada da percorrere, e finito con funzionalità che funziona un po 'come questo:

<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>

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

Phil

P.S. Ci scusiamo per l'autopromozione palese:)

Io metterei una proprietà Bool nella voce di classe ViewModel e scrivere DataTrigger sul ItemTemplate per dare un aspetto diverso. Nella collezione possiamo scorrere e set che bool opportunamente

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top