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>

对于性能和代码的可读性/正确性来说,这显然是相当糟糕的。这也使得我更难正确格式化输出。因此,问题是:

  • 有人能推荐一种更好的方法在SL2中实现这一点吗
  • 有人能确认SL3的情况是否有所改善吗
  • 谢谢, 肯特

  • 对。Silverlight 2或Silverlight 3不支持DataTemplate中的数据类型

  • 您可以在Silverlight中使用ItemTemplateSelector。请看一下这个样品

  • 对。Silverlight 2或Silverlight 3不支持DataTemplate中的数据类型

  • 您可以在Silverlight中使用ItemTemplateSelector。请看一下这个样品


  • 如果它能让您感觉更好,那么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);
        }
    }