我不确定您的方法或为什么存在性能问题,但这是我对类似问题的解决方案。
完整的解决方案可以找到https://github.com/steinborge/ProxyTypeHelper/wiki https://github.com/steinborge/ProxyTypeHelper/wiki
我想要实现的是创建“通用”视图模型的能力,然后可以将其分配给数据模板。数据模板只是一个用户控件。如果您有很多简单的数据维护屏幕,则可以节省大量重复代码。
但有几个问题。数据模板在具有泛型的 XAML 中不能很好地工作,如果您有大量数据模板,那么您将创建大量 XAML - 特别是如果您想在单独的视图中使用它。在您的例子中,您提到最多 90 个视图 - 这将是大量的 XAML。
解决方案是将模板存储在查找中,并根据 DataContext 使用内容控件和 DataTemplateSelector 进行填充。所以首先需要注册数据模板/视图:
manager.RegisterDataTemplate(typeof(GenericViewModel<CarType, WPFEventInter.ViewModel.CarTypeViewModel>), typeof(WPFEventInter.UserControls.CarTypesView));
manager.RegisterDataTemplate(typeof(GenericViewModel<Colour, WPFEventInter.ViewModel.ColourViewModel>), typeof(WPFEventInter.UserControls.ColourView));
RegisterDataTemplate 只是将数据模板添加到字典中:
public void RegisterDataTemplate(Type viewModelType, Type dataTemplateType, string Tag="")
{
var template = BuildDataTemplate(viewModelType, dataTemplateType) ;
templates.Add(viewModelType.ToString() + Tag, template);
}
private DataTemplate BuildDataTemplate(Type viewModelType, Type viewType)
{
var template = new DataTemplate()
{
DataType = viewModelType,
VisualTree = new FrameworkElementFactory(viewType)
};
return template;
}
现在使用 ContentPresenter 控件创建一个视图。这将根据视图的 Datacontext 显示视图。
DataTemplateSelector 如下所示。这将根据数据上下文返回适当的视图:
public class ContentControlGenericTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
DataTemplate retVal = null;
try
{
retVal = Core.WPF.Infrastructure.DataTemplateManager.templates[item.GetType().ToString()];
}
catch //empty catch to prevent design time errors..
{
}
return retVal;
}