代码之家  ›  专栏  ›  技术社区  ›  Snark

在何处实例化视图模型对象?

  •  3
  • Snark  · 技术社区  · 15 年前

    viewmodel表示单个windows数据(一些滑块值、progressbar值和一些文本字符串)。其中一些直接附加到已公开的模型,其他则位于viewmodel中,以避免向模型添加新功能。)

    所以我的问题是:我应该将viewmodel作为App.Xaml中的静态资源、作为代码隐藏中App.Xaml.cs类的成员(在重写的“OnStartup”方法内部)还是作为Window.Xaml中的资源、或者作为Window.Xaml.cs中的对象来实例化。

    我看到人们把它作为一个本地资源,作为创业的全球对象,但对我来说,它似乎不应该在代码后面(我所做的就是把它抛在空中,一旦它存在,它就可以处理其他所有的事情。事实上,这就是它的全部意义。

    那么关于viewmodel应该在哪里实例化的想法呢?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Robert Rossney    15 年前

    窗口视图模型只存在于窗口的生命周期中是完全正常的。创建它可以很简单地放:

    DataContext = new MainWindowViewModel();
    

    在构造函数中 MainWindow DataContext 在所有事件处理程序中。)

    通常,视图模型需要与一个或多个域对象进行互操作。在这种情况下,我们面临的挑战是如何告诉视图模型关于该对象,而不将域对象耦合到创建视图模型的窗口。这就是您开始使用服务、服务定位器和可模拟对象等的地方。

    ServiceLocator loc = (ServiceLocator) FindResource("AppServiceLocator");
    DataContext = new MainWindowViewModel(loc);
    

    我唯一一次 不要 数据上下文 .

        2
  •  0
  •   silverfighter    15 年前

    我通常使用ViewModelLocator的概念。

    ViewModelLocator使用IoC进行依赖注入(Ninject/Unity/…),并且可以在DI中为ViewModel的Livetime定义一个作用域。。。

    也有一些博客文章与MEF和ViewModelLocator概念一起工作。。。