Silverlight 不支持 ItemsControl 中的交替项模板。关于如何实现这一点,我有一些想法,但为了避免污染潜在的答案,我将它们排除在外。
这个想法与普通的 ItemTemplate 相同,因为它不依赖于绑定数据上下文中的任何内容来运行。我希望该功能保留在视图中(假设为 MVVM)
如果您必须设计一种为 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
不是很准确,需要更改,否则应该可以。
我最近陷入了同样的问题。我最终决定附加属性是要走的路,最终得到的功能有点像这样:
<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 对不起公然的自我宣传:)
我会在 Item ViewModel 类中放置一个 Bool 属性,并在 ItemTemplate 上编写 DataTrigger 以提供不同的外观。在集合中,我们可以循环并适当地设置该 bool