2

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

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

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

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

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

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

4

1 回答 1

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}" />

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

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

类似的东西?

于 2012-07-04T22:51:11.133 回答