我知道默认情况下CM会在Views文件夹中查找ShellView以用作ShellViewModel视图,但我想使用MainWindow。。。这能做到吗?如何做到?
工作原理
CM使用一组View/ViewModel命名约定,一般来说,如果您有一个名为FooViewModel
的ViewModel,CM将尝试查找具有类似名称FooView
或FooPage
的类型。
如果您真的想要"MainWindow"one_answers"ShellViewModel"怎么办
如果您只是想将现有的"MainWindow"与现有的"根视图模型"一起使用,那么可以考虑将Bootstrapper<TRootModel>
子类化并覆盖OnStartUp
。这是一个规定的方法,但可能看起来令人生畏。
(我还没有测试这个代码。)
protected override void OnStartup(object sender, StartupEventArgs e)
{
var rootModel = IoC.Get<TRootModel>();
var rootView = new MainWindow();
ViewModelBinder.Bind(rootModel, rootView, this);
rootView.Show();
}
当然,上述方法仅适用于启动期间显示的根视图模型的初始视图。我不确定将来尝试显示ShellViewModel
的视图是否可行,或者可能会导致错误。
扩展约定
有几种方法可以自定义约定本身。最灵活和直接的方法是拦截/挂接Caliburn.Micro.ViewLocator.LocateForModelType
,这允许您修改视图定位过程中应用的行为/策略。
private static void CustomViewLocatorStrategy()
{
// store original implementation so we can fall back to it as necessary
var originalLocatorStrategy = Caliburn.Micro.ViewLocator.LocateForModelType;
// intercept ViewLocator.LocateForModelType requests and apply custom mappings
Caliburn.Micro.ViewLocator.LocateForModelType = (modelType, displayLocation, context) =>
{
// implement your custom logic
if (modelType == typeof(ShellViewModel))
{
return new MainWindow();
}
// fall back on original locator
return originalLocatorStrategy(modelType, displayLocation, context);
};
}
以上内容可从Bootstrapper<TRootModel>.Configure
超控内部调用:
protected override void Configure()
{
CustomViewLocatorStrategy();
base.Configure();
}
这种方法更有可能与CM配合使用(即在任何视图缓存方面)。然而,它仍然打破了惯例,而且仍然是相当多的代码。
正在注册附加后缀
我想指出的一件事是ViewLocator.RegisterViewSuffix
实现,但我还没有机会参与其中。我相信,如果您执行ViewLocator.RegisterViewSuffix(@"Window")
,那么您可以依靠CM将MainViewModel
映射到MainWindow
。
这将允许使用更具表现力的后缀(如Window、Dialog、Form或您可能想要使用的其他后缀。)就我个人而言,我不喜欢使用"View"作为后缀,我认为它太通用了(毕竟,它们都是视图。)
Caliburn.Microo默认不查找ShellView,这就是工作方式。假设你有一个引导程序定义如下:
class MyBootsrtapper : Bootstrapper<MyViewModel> { }
然后CM(Caliburn.Micro)将查找名为MyView的视图。因此,是的,只要视图模型名称为MainWindowViewModel,就可以使用MainWindow
我已经回答了你问的另一个问题,你似乎还没有完全理解CM,所以我真的非常建议你从这里开始,你可以随时查看codeplex上的项目文档因为它包含所有更新的信息和文档。
编辑:
Caliburn.Micro使用一个简单的命名约定来定位ViewModels。本质上,它采用FullName并删除"Model"因此,给定MyApp.ViewModels.MyViewModel,它将查找MyApp.Views.MyView.
摘自此处的官方文件。