我有一个代表格式化内容的视图模型层次结构:
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 { ... }
}
然后我有一个ContentView
呈现内容的所有部分:
<UserControl ...>
<ItemsControl ItemsSource="{Binding ContentParts}"/>
</UserControl>
在理想的世界中,我只需DataTemplate
为每个内容部分类型定义一个,然后相应地呈现它们。但是,Silverlight 不支持该类的DataType
属性DataTemplate
,因此这不是一个选项。
另一种选择是提供一个DataTemplateSelector
并进行从视图模型类型到DataTemplate
我自己的映射。唉,ItemsControl
在 SL2 中没有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>
对于性能和代码的可读性/正确性而言,这显然是相当糟糕的。这也让我更难正确格式化输出。所以,问题:
- 谁能推荐一个更好的方法在 SL2 中做到这一点?
- 谁能确认SL3的情况是否有所改善?
谢谢,肯特