DataTemplate + MVVM

I use MVVM, and each View maps the ViewModel to the convention. IE MyApp.Views.MainWindowView MyApp.ViewModels.MainWindowViewModel

Is there a way to remove a DataTemplate and do it in C #? with some kind of loop?

<DataTemplate DataType="{x:Type vm:MainWindowViewModel}">
    <vw:MainWindowView />
</DataTemplate>
+5
source share
2 answers

Basically, you need to create data templates programmatically ... It's not very simple, but I think you can achieve this with a class 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);
}

I have not tested it, so several settings may be required ... For example, I'm not sure what type of resource key should be, since it is usually set implicitly when you install DataType in XAML

+6
source

, , .

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);
        }
    }
+6

All Articles