我有一个基本的ViewModel和关联的View。我也有多个从基本ViewModel派生的ViewModel,但是我想使用基本View进行显示。
基本ViewModel和 View :
MyCompany.MyApp.Modules.Wizard.ViewModels.WizardViewModel
MyCompany.MyApp.Modules.Wizard.Views.WizardView
源自
WizardViewModel
:MyCompany.MyApp.Modules.NewSpec.ViewModels.NewSpecViewModel : WizardViewModel
MyCompany.MyApp.Modules.Wizard.Views.WizardView
)MyCompany.MyApp.Modules.NewSpec.ViewModels.NewMaterialViewModel : WizardViewModel
MyCompany.MyApp.Modules.Wizard.Views.WizardView
)我认为使用ViewLocator or ViewModelLocator或NameTransformer中的映射应该有可能,但是我还没有弄清楚。
我正在将Gemini Framework与Caliburn.Micro v1.5.2一起使用(我计划很快升级到v2)。
这是我尝试过的事情之一:
public class NewSpecViewModel : WizardViewModel
{
// ...
static NewSpecViewModel()
{
// Escape the '.' for the regular expression
string nsSource = typeof(NewSpecViewModel).FullName.Replace(".", @"\.");
string nsTarget = typeof(WizardViewModel).FullName;
nsTarget = nsTarget.Replace("WizardViewModel", "Wizard");
// nsSource = "MyCompany\\.MyApp\\.Modules\\.NewSpec\\.ViewModels\\.NewSpecViewModel"
// nsTarget = "MyCompany.MyApp.Modules.Wizard.ViewModels.Wizard"
ViewLocator.AddTypeMapping(nsSource, null, nsTarget);
}
// ...
}
P.S.我知道已有向导向导框架(Extended WPF Toolkit,Avalon Wizard等),但是我不想添加其他第三方程序集,并且Extended WPF Toolkit向导无法正常工作。
P.P.S.我还想在其他地方使用这种样式的基本ViewModel/View映射。
最佳答案
这是正确的[a链接](https://caliburnmicro.codeplex.com/discussions/398456)。
编辑:由于codeplex关闭,这是来自讨论的代码:
var defaultLocator = ViewLocator.LocateTypeForModelType;
ViewLocator.LocateTypeForModelType = (modelType, displayLocation, context) =>
{
var viewType = defaultLocator(modelType, displayLocation, context);
while (viewType == null && modelType != typeof(object))
{
modelType = modelType.BaseType;
viewType = defaultLocator(modelType, displayLocation, context);
}
return viewType;
};
关于c# - 将派生的ViewModels映射到Caliburn.Micro中的基类View,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24764701/