Wpf 数据模板&x2B;MVVM

Wpf 数据模板&x2B;MVVM,wpf,mvvm,datatemplate,Wpf,Mvvm,Datatemplate,我使用的是MVVM,每个视图都映射到具有约定的ViewModel。即 MyApp.Views.MainWindowView MyApp.ViewModels.MainWindowViewModel 有没有办法删除DataTemplate并在C#中执行?用某种循环 <DataTemplate DataType="{x:Type vm:MainWindowViewModel}"> <vw:MainWindowView /> </DataTemplate>

我使用的是MVVM,每个视图都映射到具有约定的ViewModel。即 MyApp.Views.MainWindowView MyApp.ViewModels.MainWindowViewModel

有没有办法删除DataTemplate并在C#中执行?用某种循环

<DataTemplate DataType="{x:Type vm:MainWindowViewModel}">
    <vw:MainWindowView />
</DataTemplate>

因此,基本上,您需要以编程方式创建数据模板。。。这不是很简单,但我认为您可以通过
FrameworkElementFactory
类实现这一点:

public void AddDataTemplateForView(Type viewType)
{
    string viewModelTypeName = viewType.FullName + "Model";
    Type viewModelType = Assembly.GetExecutingAssembly().GetType(viewModelTypeName);

    DataTemplate template = new DataTemplate
    {
        DataType = viewModelType,
        VisualTree = new FrameworkElementFactory(viewType)
    };

    this.Resources.Add(viewModelType, template);
}

我没有测试它,所以一些调整可能是必要的。。。例如,我不确定资源键的类型应该是什么,因为当您在XAML中设置数据类型时,它通常是隐式设置的

添加资源时需要使用DataTemplateKey:D

    private void AddAllResources()
    {
        Type[] viewModelTypes = Assembly.GetAssembly(typeof(MainWindowViewModel)).GetTypes()
            .Where(t => t.Namespace == "MyApp.ViewModels" && t.Name.EndsWith("ViewModel")).ToArray();

        string viewName = null;
        string viewFullName = null;

        foreach (var vmt in viewModelTypes)
        {
            viewName = vmt.Name.Replace("ViewModel", "View");
            viewFullName = String.Format("MyApp.Views.{0}, MyApp", viewName);

            DataTemplate template = new DataTemplate
            {
                DataType = vmt,
                VisualTree = new FrameworkElementFactory(Type.GetType(viewFullName, true))
            };

            this.Resources.Add(new DataTemplateKey(vmt), template);
        }
    }