collections - 在Silverlight 2中渲染 View 模型的异构集合

标签 collections silverlight-3.0 mvvm silverlight-2.0 heterogeneous

我有一个表示格式化内容的 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>

对于性能和代码的可读性/正确性而言,这显然是很糟糕的。这也使我很难正确格式化输出。所以,问题:
  • 有人可以推荐一种更好的SL2方法吗?
  • 谁能确认SL3的情况是否有所改善?

  • 谢谢,
    肯特郡

    最佳答案

  • 是的。 Silverlight 2或Silverlight 3不支持DataTemplate中的DataType。
  • 您可以在Silverlight中解决ItemTemplateSelector。请看一下这个样本。

  • 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/

    相关文章:

    scala - 如何在 Scala 中创建具有有界类型参数的自定义 Seq?

    python - 计算连续的字母和连字符并将它们编码为运行长度

    collections - 比较 Java8 中的 Instants

    grails - Groovy 从单个对象获取列表

    silverlight - Silverlight 3 中的字体渲染有改进吗?

    silverlight - 如何在 Silverlight 中从半径和内角绘制圆弧

    silverlight-3.0 - 如何使用 VisualStateManager 返回 "Base"状态?

    c# - WPF 绑定(bind)不更新 XAML 但调用了 PropertyChanged

    c# - WPF ListBoxItem 样式是否覆盖了我的 ItemTemplate?

    java - 如何在AsyncTask中传递两个参数?