我有一个xaml页面,它上面有一个ItemsControl控件。 ItemsControl绑定到ObservableCollection的Guests。客人收藏品可以具有两种不同类型的物品:USGuest和UKGuest,均从客人继承。是否有可能为ItemsControl制作两个(或更多)模板,并根据集合中当前项目的运行时类型自动选择它们?如何使ItemsControl根据运行时类型选择不同的模板
回答
对不起,我不是故意要扫大家的兴,而不是提供一个解决方案。但这是我在Silverlight中使用MVVM时遇到的最大障碍之一。
我在过去做过的一件事就是使用一个带有ContentPresenter的UserControl作为ItemsTemplate。 (如此多的图层!)在UserControl中,当DataContext发生变化时,我会从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方法。因此,要覆盖,看看有什么杰里米Likness在这里说一下:
http://www.codeproject.com/Articles/38559/Silverlight-DataContext-Changed-Event.aspx
我用那个漂亮频繁。谢谢,杰里米!
此外,与WPF在该领域为您提供的所有功能相比,还存在一些非常严格的限制。例如,真的没有什么好办法伪造一个ItemContainerStyle选择器。 (我知道的。)
我还没有尝试过这个,但是您是否尝试将ItemsSource设置为Guest对象的ObservableCollection并为这两种类型设置DataTemplate?
<DataTemplate DataType="{x:Type my:USGuestViewModel}">
<my:USGuestView/>
</DataTemplate>
<DataTemplate DataType="{x:Type my:UKGuestViewModel}">
<my:UKGuestView/>
</DataTemplate>
编辑:“我”是你的ViewModels和视图生活的命名空间的声明,所以你应该在XAML的beggining添加如下内容:
<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.Resources>
<DataTemplate DataType="{x:Type my:USGuestViewModel}">
<my:USGuestView/>
</DataTemplate>
<DataTemplate DataType="{x:Type my:UKGuestViewModel}">
<my:UKGuestView/>
</DataTemplate>
</UserControl.Resources>
+1,这可能是最好的方式。只需将这些模板放置在ItemsControl的资源中 – 2010-06-28 14:07:06
我在ItemControl的资源中添加了模板,并且出现构建错误“成员”DataType“无法识别或访问”。我提到我正在开发Silverlight 4项目吗?这一切都可以在Silverlight中实现吗? – durad 2010-06-28 14:19:35
我认为它虽然有一些方法不存在于Silverlight中。我不认为是这样。我将使用更完整的代码编辑帖子代码片段 – jpsstavares 2010-06-28 15:05:43
- 1. 根据ViewModel类型为ItemsControl选择DataTemplate
- 2. 在运行时选择基类类型,如模板
- 3. 使用InstantSearch.js在运行时选择不同的模板
- 4. shell脚本,如何根据选择运行不同的代码?
- 5. 如何根据属性的运行时类型动态选择验证器?
- 6. 为什么不根据其对象的运行时类型选择此方法?
- 7. 根据模板参数选择成员类型?
- 8. 不同的标签根据内容类型使用不同的模板文件?
- 9. 根据列值选择不同的行
- 10. 如何选择和使用不同数据类型的功能?
- 11. 根据模板参数包装类型容器的模板类
- 12. 如何使用不同类型的XSLT模板(“基于模块”)?
- 13. SQL - 如何根据不同表中的值选择行?
- 14. 模板类型推演:不同的模板类型
- 15. 如何计算在运行时选择的类型“对象”
- 16. 如何根据对象的值为组合框选择模板
- 17. 如何根据Django模板中的索引选择<option>
- 18. 如何根据另一个选择查询的数据运行选择查询
- 19. 根据父类型在运行时映射不同的子外键列
- 20. 根据类类型C++运行代码
- 21. XSLT如何根据属性选择模板
- 22. 根据成员类型可用性选择C++模板专门化
- 23. 如何在运行时使用C++获取给定元素的模板类型?
- 24. 如何创建不同数据类型的列表,根据类型迭代并执行不同的操作?
- 25. C++模板专业化。你如何选择特定的类型?
- 26. 使用模板从函数返回不同的数据类型
- 27. 根据用户在Django模板中选择不同的样式表
- 28. 如何根据变量选择模式?
- 29. 如何根据日期字段选择不同的数据?
- 30. 使类的成员根据模板
等一下,你问的是在Silverlight中这样做的,对吧? – MojoFilter 2010-07-06 14:26:16