具有交替ItemTemplate的Silverlight ItemsControl

Silverlight不支持ItemsControl中的交替项模板.关于如何实现这一点,我有一些想法,但为了避免污染潜在的答案,我会把它们排除在外.

这个想法与普通的ItemTemplate相同,因为它不依赖于绑定数据上下文中的任何东西来运行.我希望功能保留在视图中(假设MVVM)

如果您必须为ItemsControl设计一种提供交替模板(我的意思是完整数据模板)的方法,您将如何实现这一目标?

解决方法

扩展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的方式不是很准确,需要更改,但否则这应该有效.

相关文章

如何在Silverlight4(XAML)中绑定IsEnabled属性?我试过简单的...
我正在编写我的第一个vb.net应用程序(但我也会在这里标记c#,...
ProcessFile()是在UIThread上运行还是在单独的线程上运行.如...
我从同行那里听说,对sharepoint的了解对职业生涯有益.我们不...
我正在尝试保存一个类我的类对象的集合.我收到一个错误说明:...
我需要根据Silverlight中的某些配置值设置给定控件的Style.我...