如何使用MainWindow作为ShellViewModel View?

时间:2013-06-28 19:32:05

标签: wpf mvvm caliburn.micro

据我所知,默认情况下,CM会在Views文件夹中查找ShellView以用作ShellViewModel View,但我想使用MainWindow ...可以这样做吗?

2 个答案:

答案 0 :(得分:1)

如何运作

CM使用一组View/ViewModel Naming Conventions,一般来说,如果您有一个名为FooViewModel的ViewModel,CM会尝试找到类似名称为FooView或{{1}的类型}。

如果真的想要“MainWindow”和“ShellViewModel”怎么办?

如果您只想将现有的“MainWindow”与现有的“root viewmodel”一起使用,请考虑继承FooPage并覆盖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

这种方法更有可能与CM一起使用(就任何视图缓存而言,即。)然而,它仍然会破坏约定,并且它仍然是相当数量的代码。

注册其他后缀?

有一件事我想指出,但没有机会参与,是 protected override void Configure() { CustomViewLocatorStrategy(); base.Configure(); } 实施。我相信如果您执行ViewLocator.RegisterViewSuffix,那么您可以依靠CM将ViewLocator.RegisterViewSuffix(@"Window")映射到MainViewModel

这将允许更具表现力的后缀(例如Window,Dialog,Form或其他您可能想要使用的。)我个人不喜欢使用'View'作为后缀,我相信它太通用了(毕竟,他们都是意见。)

答案 1 :(得分:0)

Caliburn.Micro默认情况下不会查找ShellView,这就是它的工作原理。假设你有一个像这样定义的引导程序:

class MyBootsrtapper : Bootstrapper<MyViewModel> { }

然后CM(Caliburn.Micro)将查找名为MyView的视图。所以,只要视图模型名称是MainWindowViewModel,就可以使用MainWindow 我已经回答了你提出的另一个问题,看来你并没有完全理解CM,所以我真的建议你到Start Here,你可以随时查看项目Documentation在codeplex上,因为它包含所有更新的信息和文档。

修改:

  

Caliburn.Micro使用简单的命名约定来查找Views   的ViewModels。从本质上讲,它采用FullName并删除“模型”   从中。因此,给定MyApp.ViewModels.MyViewModel,它会寻找   MyApp.Views.MyView。

取自official documentation here