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

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

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

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

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

如果我正在使用Module Discovery,该怎么做才能显示相应 View 模型中的 View ?

最佳答案

您是否看过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>

这样的东西?

关于c# - 查看ItemsControl内部的注入(inject),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11335884/

10-12 20:35