如何将MainWindow用作ShellViewModel视图



我知道默认情况下CM会在Views文件夹中查找ShellView以用作ShellViewModel视图,但我想使用MainWindow。。。这能做到吗?如何做到?

工作原理

CM使用一组View/ViewModel命名约定,一般来说,如果您有一个名为FooViewModel的ViewModel,CM将尝试查找具有类似名称FooViewFooPage的类型。

如果您真的想要"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.

摘自此处的官方文件。

相关内容

  • 没有找到相关文章

最新更新