在ItemsControl中查看注入

时间:2012-07-04 22:08:13

标签: c# wpf silverlight mvvm prism

在我的申请中,我正在处理ItemControl。此itemControl接收ObservableCollection。

如上所示,BaseItemViewModel是一个抽象类。当我的应用程序启动时,moduleCatalog通过发现加载模块。

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

的类

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

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

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

1 个答案:

答案 0 :(得分:3)

你看过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}" />

并将您的datatemplates设置为名称:

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

那样的东西?