1

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

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

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

  1. 在 App.xaml.cs 中创建模型实例作为属性,并在视图的代码隐藏中进行绑定。(这是官方数据绑定应用程序示例的方式。)但是当面对大量视图时(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最好呢?

4

3 回答 3

0

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

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

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

我现在在 wp 市场上有 4 个应用程序,并且我已经在后面的代码中试验了视图模型,正如我为你和 MVVM light 和 caliburn micro 所建议的那样。希望这可以帮助。

于 2013-05-14T15:41:16.230 回答
0

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

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

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

于 2013-05-16T22:04:20.913 回答
0

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

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

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

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


我也完全同意@Paul 的回答

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

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

于 2013-05-19T18:14:39.117 回答