Динамически созданные DataTemplate не отображают элементы управления в интерфейсе запущенной программы

Я генерирую DateTemplate для моих Views и ViewModels в файле App.xaml.cs

private void GenerateMvvmDataTemplates()
    {
        string projectName = Assembly.GetEntryAssembly().GetName().Name;
        var dataTemplatesResourceDictionary = new ResourceDictionary
        {
            Source = new Uri($"/{projectName};component/Resource/DataTemplates/AllDataTemplates.xaml", UriKind.Relative)
        };
        var viewModelAssembly = Assembly.GetExecutingAssembly();
        var viewModels = viewModelAssembly.GetTypes()
            .Where(type => type.Namespace != null && type.Namespace.StartsWith($"{projectName}.ViewModel"));
        var views = viewModelAssembly.GetTypes()
            .Where(type => type.Namespace != null && type.Namespace.StartsWith($"{projectName}.View"));
        foreach (var viewModel in viewModels)
        {
            if (viewModel.Name.StartsWith("Mock") || viewModel.Name.StartsWith("<>")) continue;
            var viewName = viewModel.Name.Replace("ViewModel", "View");
            var viewType = views.FirstOrDefault(type => type.Name == viewName);
            if (viewType != null)
            {
                var dataTemplate = new DataTemplate { DataType = viewModel };
                dataTemplate.VisualTree = new FrameworkElementFactory(viewType);
                dataTemplatesResourceDictionary.Add(Guid.NewGuid(), dataTemplate);
            }
        }
        Current.Resources.MergedDictionaries.Add(dataTemplatesResourceDictionary);
    }

Я его запускаю в обработчике события App_OnStartup:

private void Application_Startup(object sender, StartupEventArgs e)
    {
        GenerateMvvmDataTemplates();
        
        IWindowService windowService = Services.GetService<IWindowService>();

        windowService.ShowWindow<View.Start.MainView>();
    }

Но вместо ожидаемых элементов управления в интерфейсе я вижу строки полученные через метод ToString();

Если я вручную опишу DataTemplate и подключу в файл App.xaml.cs, то все работает и отображается.


Ответы (1 шт):

Автор решения: velial

Полагаю, проблема в ключе, с которым Вы добавляете шаблон в словарь.

Ваш код:

dataTemplatesResourceDictionary.Add(Guid.NewGuid(), dataTemplate);

Попробуйте так:

dataTemplatesResourceDictionary.Add(dataTemplate.DataTemplateKey, dataTemplate);

См. также: DataTemplate.DataTemplateKey (документация Microsoft)

→ Ссылка