Collections 在Silverlight 2中呈现视图模型的异构集合
我有一个表示格式化内容的视图模型层次结构:Collections 在Silverlight 2中呈现视图模型的异构集合,collections,silverlight-3.0,mvvm,silverlight-2.0,heterogeneous,Collections,Silverlight 3.0,Mvvm,Silverlight 2.0,Heterogeneous,我有一个表示格式化内容的视图模型层次结构: public abstract class ContentPartViewModel : ViewModel { } public class TextContentPartViewModel : ContentPartViewModel { public string Text { ... } } public class TitleContentPartViewModel : TextContentPartViewModel { }
public abstract class ContentPartViewModel : ViewModel
{
}
public class TextContentPartViewModel : ContentPartViewModel
{
public string Text { ... }
}
public class TitleContentPartViewModel : TextContentPartViewModel
{
}
public class HyperlinkContentPartViewModel : TextContentPartViewModel
{
public string Uri { ... }
}
我有一个包含要呈现的ContentPartViewModel
s集合的包含视图模型:
public class ContentViewModel
{
public ICollection<ContentPartViewModel> ContentParts { ... }
}
在理想情况下,我只需为每个内容部分类型定义一个DataTemplate
,并相应地呈现它们。但是,Silverlight不支持数据模板
类上的数据类型
属性,因此这不是一个选项
另一个选项是提供一个DataTemplateSelector
,并执行从视图模型类型到DataTemplate
的映射。唉,SL2中的ItemsControl
没有ItemTemplateSelector
属性-只有ItemTemplate
属性
这让我别无选择,只能提供一个ItemTemplate
,然后使用转换器关闭除与该内容部分相关的部分之外的所有UI:
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Text}" FontWeight="Bold" Visibility="{Binding Converter={StaticResource TitleContentPartConverter}}"/>
<TextBlock Text="{Binding Text}" Visibility="{Binding Converter={StaticResource TextContentPartConverter}}"/>
<HyperlinkButton Content="{Binding Text}" NavigateUri="{Binding Uri}" Visibility="{Binding Converter={StaticResource HyperlinkContentPartConverter}}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
对于性能和代码的可读性/正确性来说,这显然是相当糟糕的。这也使得我更难正确格式化输出。因此,问题是:
如果它能让您感觉更好,那么ModelView中的“视图”实际上解释了绑定中可见性的存在。不过,我确实感觉到了您的痛苦(也在等待SL5的到来),如果它让您感觉更好,ModelView中的“视图”实际上解释了绑定中可见性的存在。不过我确实感觉到了你的痛苦(也在等待SL5),谢谢Michael。不太理想,我必须自己创建所有的基础设施和各种ItemsControl的子类,但似乎它应该可以工作。一旦我尝试了它,它就会更新。这个示例和这个问题也不是很完整,没有这个链接:它向您展示了如何定义DataTemplate资源并以编程方式引用它们。谢谢Michael。不太理想,我必须自己创建所有的基础设施和各种ItemsControl的子类,但似乎它应该可以工作。一旦我尝试了它,它就会更新。这个问题的示例也不是很完整,没有这个链接:它向您展示了如何定义DataTemplate资源并以编程方式引用它们。
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Text}" FontWeight="Bold" Visibility="{Binding Converter={StaticResource TitleContentPartConverter}}"/>
<TextBlock Text="{Binding Text}" Visibility="{Binding Converter={StaticResource TextContentPartConverter}}"/>
<HyperlinkButton Content="{Binding Text}" NavigateUri="{Binding Uri}" Visibility="{Binding Converter={StaticResource HyperlinkContentPartConverter}}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
DataTemplateSelector selector = this.ItemTemplateSelector;
if (null != selector)
{
((ContentPresenter)element).ContentTemplate = selector.SelectTemplate(item, element);
}
}