【问题标题】:Where to bind the ViewModel to the View?在哪里将 ViewModel 绑定到 View?
【发布时间】:2013-05-14 13:17:32
【问题描述】:

我在 Windows Phone 7.5 及更高版本上处理一个项目(6 页)目标。我不做纯 MVVM 模型,因为处理导航事件和查询字符串太痛苦了,我决定一个一个地学习,先完成项目:P

由于我是 MVVM 的新手,我决定不使用 MVVM Light,自己编写所有样板代码。 当我完成每个部分的编码时,我面临一个问题。

在哪里绑定视图模型是最有效的。我阅读了很多并总结了以下几点。

  1. 在 App.xaml.cs 中创建 Model 实例作为属性,并在视图的代码隐藏中进行绑定。(这是官方数据绑定应用程序示例的方式。)但是当面对大量视图时( 6 页等),这可能是个问题。

    public partial class App : Application
    {
        private static MainViewModel viewModel = null;
    
        /// <summary>
        /// A static ViewModel used by the views to bind against.
        /// </summary>
        /// <returns>The MainViewModel object.</returns>
        public static MainViewModel ViewModel
        {
            get
            {
                // Delay creation of the view model until necessary
                if (viewModel == null)
                    viewModel = new MainViewModel();
    
                return viewModel;
            }
        }
    }
    
  2. 在视图后面的代码中创建一个新的视图模型实例作为全局变量。所以我可以在整个视图中使用它。 (如上,我不做纯MVVM)

  3. 在后面的代码中,在构造函数中,做一次绑定。

    public MainPage()
    {
        InitializeComponent();
    
        myViewModel vm = new myViewModel();
        DataContext = vm;
    }
    

我阅读了使用 ViewModelLocator 作为中心站的 mvvm light。但是避免使用mvvm light,你们觉得在哪里绑定viewmodel最好呢?

【问题讨论】:

  • 您还可以在 App.xaml 或 SomePage.xaml 中将其定义为资源,然后将 DataContext 绑定到该资源,这样您甚至不需要任何代码。现在你有 5 个选项。 :) 将它保存在 App.xaml.cs 中的好处之一是您可以在不同视图之间共享相同的 VM 实例 - 如果这正是您所需要的。
  • 感谢@igrali,现在我知道何时将视图模型放入 App 部分 :)

标签: c# windows-phone-7 mvvm viewmodel


【解决方案1】:

MVVM 只是一种模式,不使用纯 mvvm 也可以。就个人而言(最终这一切都取决于您的偏好)我认为选项 3 是理想的。

由于视图优先的方法,在 windows phone 中尤其如此。我也不喜欢将我的应用程序代码与视图模型混杂在一起的想法。我认为后面的视图代码是设置和绑定视图模型的更自然的位置。一般来说,视图模型应该是视图的一个实例。例如,我不想让不同项目的详细信息页面共享一个详细信息视图模型,显然它们会显示相同的数据。虽然一个视图模型可以用于不止一种类型的视图,但它通常不会用于多个视图实例。

我可以看到将其放入应用程序代码的唯一好处是您可以从任何地方访问您的视图模型实例。虚拟机“a”需要告诉虚拟机“b”刷新。这在像这样的移动平台中并不常见,尽管我在拖放场景或子窗口中更需要它。好消息是,如果您确实需要该功能,您仍然不需要制作静态视图模型,您可以自己实现或只从 mvvmlight 中提取消息库。

我现在在 wp 市场上有 4 个应用程序,我已经按照我为您建议的代码中的视图模型以及 MVVM light 和 caliburn micro 进行了试验。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    ViewModelLocator 模式不限于 MVVMLight。对于这种模式,您需要做的就是创建一个具有一组属性的类。这些属性中的每一个都将返回一个视图模型的实例。在 App.xaml 文件的资源部分中,定义将创建此类实例的资源。然后,在您看来,您将(DataContext 的)“Source”属性设置为指向资源,例如Source={StaticResource ....}" 并且路径将是此 StaticResource/Class 实例上的属性名称。

    在您的第一个示例中,您接近遵循此模式。但是,您的 App 类充当 ViewModelLocator,因为它公开了视图模型的实例。与 ViewModelLocator 公开视图模型实例的方式相同。不同之处在于您使用代码隐藏而不是使用 XAML 直接绑定到此 App.Property。

    最简单的选项是 3. 创建一个新实例并将其分配给数据上下文。但如果我是你,我会再次查看 ViewModelLocator 模式。它实现了相同的目标,但它将视图模型的管理和生命周期与视图分开。

    【讨论】:

      【解决方案3】:

      我个人更喜欢在 OnNavigatedTo 处理程序中创建 ViewModel。

      我发现这是最好的地方,因为它是在构造函数被调用之后调用的,它是导航参数可用的第一个地方。

      显然,您必须小心不要在向后导航时调用此函数(除非您的应用正在从墓碑恢复中) - 但这很容易检查。

      这正是我在 MvvmCross 中使用的生命周期 - ViewModel 在 WindowsPhone 和 WindowsStore 上的 OnNavigatedTo 期间加载。


      我也完全同意@Paul 的回答

      一般来说,视图模型应该是视图的一个实例

      我个人不喜欢看到 ViewModel 在单例、应用程序对象等中持续存在 - 我只是在每次创建 View 时创建一个 ViewModel。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        • 2015-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多