【问题标题】:View Injection inside ItemsControl在 ItemsControl 中查看注入
【发布时间】:2012-07-05 08:36:56
【问题描述】:

在我的应用程序中,我处理的是ItemControl。这个 itemControl 接收一个 ObservableCollection。

正如您在上面看到的,BaseItemViewModel 是一个抽象类。当我的应用程序启动时,moduleCatalog 通过发现加载模块。

每个模块都有一个继承自 BaseItemViewModel 的类

所以我不能像这样在 ItemsControl 中设置 dataTemplates:

<DataTemplate> 
    <View:GeneralSettingsView/> 
</DataTemplate> 
<DataTemplate> 
    <View:AdvancedSettingsView/> 
</DataTemplate> 

如果我正在使用模块发现,我该怎么做才能显示来自相应视图模型的视图?

【问题讨论】:

标签: c# wpf silverlight mvvm prism


【解决方案1】:

您查看过 ItemTemplateSelector 属性吗?

例如,创建一个内容选择器类:

public class myContentSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item != null)
        {
            VMBase vm = item as VMBase;

            switch (vm.Type)
            {
                case myType.General:
                    return Application.Current.Resources["GeneralSettings"] as DataTemplate;
                default:
                    return Application.Current.Resources["AdvancedSettings"] as DataTemplate;
            }
        }

        return null;
    }
}

为它创建一个静态资源:

<local:myContentSelector x:Key="contentSelector" />

并在ItemsControl中设置:

<ItemsControl ItemsSource="{Binding mySource}" ItemTemplateSelector="{StaticResource contentSelector}" />

并将您的数据模板设置为名称:

<DataTemplate x:Key="GeneralSettings" DataType="{x:Type vm:VMBase}"> 
    <View:GeneralSettingsView/> 
</DataTemplate> 
<DataTemplate x:Key="AdvancedSettings" DataType="{x:Type vm:VMBase}"> 
    <View:AdvancedSettingsView/> 
</DataTemplate> 

类似的东西?

【讨论】:

  • 通过这种方式,托管模块会意识到(并链接到)将加载到其中的模块,这与 Prism 的意图完全相反。
  • 非常感谢!有效!只是一个疑问,有没有办法通过 DataType 而不是 key 调用获取资源?
  • @Mark 如果你知道更好的方法,我也想看看。
最近更新 更多