Silverlight不支持ItemsControl中的交替项目模板。我对于如何实现这一点有一些想法,但为了避免污染潜在的答案,我会把它们排除在外。带交替项目模板的Silverlight ItemsControl
这个想法与普通的ItemTemplate相同,它不依赖绑定数据上下文中的任何函数来运行。我希望功能保留在视图中(假设为MVVM)
如果您必须设计一个为ItemsControl提供交替模板的方法(并且我的意思是一个完整的数据模板),您将如何完成此任务?
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
的方式是不是很准确,就需要改变,否则这应该工作。
我会在Item ViewModel类中放入一个Bool属性,并在ItemTemplate上写入DataTrigger以给出不同的外观。 在集合中,我们可以循环并设置适当的布尔
我在最近遇到了同样的问题。我最终决定,附加属性是要走的路,并最终与功能,工作起来有些像这样:
<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/
菲尔
附:对不起,明目张胆的自我推销:)
嗨Jobi 谢谢你,我更新的问题更清晰。我不希望这个解决方案依靠VM来运行。 – 2010-06-07 16:44:51
ViewModel决不应该决定数据的呈现方式 – 2010-10-07 18:57:33
即使虚拟机的整个观点有点误称,也是要确定数据的呈现方式。代表Visiblity的布尔值,代表状态的枚举,它总是发生。 – 2010-12-02 09:51:47