3

Silverlightは、ItemsControlの代替アイテムテンプレートをサポートしていません。私はこれを達成する方法についていくつかの考えを持っていますが、潜在的な答えを汚染することを避けるために、それらを省略します。

考え方は、機能するためにバインドされたデータコンテキスト内の何にも依存しないという点で、通常のItemTemplateと同じです。機能をビューに残したい(MVVMを想定)

ItemsControlに交互のテンプレート(つまり完全なデータテンプレート)を提供する方法を設計する必要がある場合、これをどのように実現しますか?

4

3 に答える 3

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はあまり正確ではなく、変更する必要がありますが、そうでなければこれは機能するはずです。

于 2010-06-07T20:42:14.690 に答える
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/

フィル

Ps露骨な自己宣伝でごめんなさい:)

于 2010-11-22T21:49:18.120 に答える
1

Item ViewModelクラスにBoolプロパティを配置し、ItemTemplateにDataTriggerを記述して、別の外観を与えます。コレクションでは、ループしてそのブール値を適切に設定できます

于 2010-06-07T16:42:41.773 に答える