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 以提供不同的外观。在集合中,我们可以循环并适当地设置该 bool

于 2010-06-07T16:42:41.773 回答