我有一个表示格式化内容的 View 模型层次结构:
public abstract class ContentPartViewModel : ViewModel
{
}
public class TextContentPartViewModel : ContentPartViewModel
{
public string Text { ... }
}
public class TitleContentPartViewModel : TextContentPartViewModel
{
}
public class HyperlinkContentPartViewModel : TextContentPartViewModel
{
public string Uri { ... }
}
我有一个包含在内的 View 模型,其中包含要呈现的
ContentPartViewModel
的集合:public class ContentViewModel
{
public ICollection<ContentPartViewModel> ContentParts { ... }
}
然后,我有一个
ContentView
,它呈现了内容的所有部分:<UserControl ...>
<ItemsControl ItemsSource="{Binding ContentParts}"/>
</UserControl>
在理想的世界中,我只需要为每种内容部分类型定义一个
DataTemplate
,并将它们相应地呈现。但是,Silverlight不支持DataType
类的DataTemplate
属性,因此这不是一个选择。另一个选择是提供
DataTemplateSelector
并自己执行从 View 模型类型到DataTemplate
的映射。 SL,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>
对于性能和代码的可读性/正确性而言,这显然是很糟糕的。这也使我很难正确格式化输出。所以,问题:
谢谢,
肯特郡
最佳答案
http://silverlight.net/forums/t/12598.aspx
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);
}
}
关于collections - 在Silverlight 2中渲染 View 模型的异构集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1125295/