我有一个包含ItemsControl控件的xaml页面。ItemsControl绑定到Guest,也就是ObservableCollection。Guest集合可以有两种不同类型的对象: USGuest和UKGuest,这两种对象都是从Guest继承的。有没有可能为ItemsControl创建两个(或更多)模板,并让它根据集合中当前项的运行时类型自动在它们之间进行选择?
发布于 2010-06-30 00:36:14
对不起,我不是故意要扫兴的,也不是想提供解决方案。但这是我在Silverlight中使用MVVM时遇到的最大障碍之一。
我过去做过的一件事就是使用内部只有一个ContentPresenter的UserControl作为ItemsTemplate。(这么多层!)在UserControl中,当DataContext发生变化时,我会从UserControl的资源中选择要使用的模板。(模板实际上不一定要在UserControl中,但我最喜欢这种封装。)
MainPage
<UserControl>
<UserControl.Resources>
<DataTemplate x:key="itemTemplate">
<my:ItemView />
</DataTemplate>
</UserControl.Resources>
<ItemsControl ItemTemplate="{StaticResource itemTemplate}" />
</UserControl>
ItemView.xaml:
<UserControl>
<UserControl.Resources>
<DataTemplate x:Key="Template1">
<!-- Template #1 -->
</DataTemplate>
<DataTemplate x:Key="Template2">
<!-- Template #2 -->
</DataTemplate>
</UserControl.Resources>
<ContentPresenter Name="presenter"
Content="{Binding}" />
</UserControl>
ItemView.xaml.cs
...
OnDataContextChanged(...)
{
var content = this.DataContext as MyDataType;
DataTemplate template;
switch (content.State)
{
case State1:
template = this.Resources["template1"] as DataTemplate;
break;
case State2:
template = this.Resources["template2"] as DataTemplate;
break;
}
this.presenter.ContentTemplate = template;
}
...
如果您还在继续学习,请注意,Silverlight也不像在WPF中那样提供OnDataContextChanged方法。所以,为了涵盖这一点,看看Jeremy Likness在这里是怎么说的:
http://www.codeproject.com/Articles/38559/Silverlight-DataContext-Changed-Event.aspx
我经常用这句话。谢谢,杰里米!
此外,与WPF在该领域提供的所有功能相比,这也有一些相当严重的限制。例如,真的没有好的方法来伪造ItemContainerStyle选择器。(据我所知。)
发布于 2010-06-28 13:59:49
我还没有尝试过这样做,但是您是否尝试过将ItemsSource设置为Guest对象的ObservableCollection,并为这两种类型设置DataTemplate?
<DataTemplate DataType="{x:Type my:USGuestViewModel}">
<my:USGuestView/>
</DataTemplate>
<DataTemplate DataType="{x:Type my:UKGuestViewModel}">
<my:UKGuestView/>
</DataTemplate>
编辑:'my‘是您的ViewModels和视图所在的名称空间的声明,因此您应该在xaml的请求中添加类似以下内容:
<UserControl x:Class="my.namespace.SuperView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:my.namespace">
我已经检查过了,您不能在ItemTemplate属性中设置两个DataTemplates。但您可以在UserControl资源属性中设置它们:
<UserControl.Resources>
<DataTemplate DataType="{x:Type my:USGuestViewModel}">
<my:USGuestView/>
</DataTemplate>
<DataTemplate DataType="{x:Type my:UKGuestViewModel}">
<my:UKGuestView/>
</DataTemplate>
</UserControl.Resources>
https://stackoverflow.com/questions/3132885
复制相似问题