Динамически созданные 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)