据我所知,默认情况下,CM会在Views文件夹中查找ShellView以用作ShellViewModel View,但我想使用MainWindow ...可以这样做吗?
答案 0 :(得分:1)
CM使用一组View/ViewModel Naming Conventions,一般来说,如果您有一个名为FooViewModel
的ViewModel,CM会尝试找到类似名称为FooView
或{{1}的类型}。
如果您只想将现有的“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。