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