Windows MVVM 中的通用应用程序

4

我刚开始开发通用应用程序。我已经开发了Windows 8商店应用程序,还在开发Windows Phone 8和Windows Phone 8.1(SilverLight)应用程序。问题与Windows中的通用应用程序和创建在应用程序中的单个UI的Share文件夹有关。

1. 我是新手,在MVVM方面缺乏经验。我已经以普通方式开发了Windows Phone 8和WP8.1应用程序。但是没有使用MVVM。我搜索了很多,但没有找到任何可以更好地理解MVVM的示例。我知道什么是MVVM。它类似于Asp.net的MVC。

MVVM 是:

Model: 描述数据

View-Model: 简单来说,是模型和视图之间的桥梁。

View: 一个简单的XAML页面或用户界面。

在Windows Phone 8中编写代码的普通方式或MVVM哪种方式更好或最好?

普通方式指不使用MVVM。

参考:使用模型-视图-视图模型模式分离UI和应用程序逻辑

2个回答

12

这是一个需要在单篇文章中回答的广泛问题。我将提供一些可以考虑和研究的内容。

(注意:本帖中的所有代码都是凭记忆自由书写的,可能不是100%的语法正确。)

你对MVVM的定义大多是正确的。对我而言,MVVM和MVC的主要区别在于绑定(binding)用于将View连接到View Model(Controller)。但这只是语义上的区别,我们不需要纠结于此。

无论你使用WP 7、WP 8、WP8.1、Siverlight还是Universal App,都不重要。最好从WPF开始,因为那是MVVM被引入的时候,它运行起来也更快,因为不需要在模拟器中运行应用程序。

首先要做的是从一个非常基本的示例开始。

1)创建“Views”和“ViewModels”两个文件夹。严格来说并不需要,但你肯定会需要它们。

2)创建一个带有TextBlock的空白页面。把它放在Views文件夹下并命名为MyFirstPage。在上面放置一个文本块,如下所示:

<TextBlock Text="The Title of my App" />

3) 运行该应用并确保该文本已显示。

4) 创建一个ViewModel类。这是一个基本的类文件。在ViewModels文件夹中创建它,并将其命名为MyFirstViewModel。

5) 将页面(View)连接到ViewModel。以下是我的code behinds代码,大部分情况下这就是我其中的全部内容。将DataContext设置为ViewModel是设置绑定的关键。虽然有许多其他框架可以实现此魔法,但这是发生的事情。在我看来,这是开始的最佳地点。

public class MyFirstPage : Page
{
    private MyFirstViewModel _viewModel = new MyFirstViewModel();

    public MyFirstPage()
    {
        this.Initialize???
        this.DataContext = _viewModel;
    }

6)为您的视图模型添加一个标题属性,现在只需返回一个硬编码的值。

public string Title { get { return "The Title of my App (set from View Model)"; } }

7)更新视图中的TextBlock以使用数据绑定

<TextBlock Text="{Binding Title}" />

8) 运行应用程序以测试其是否正常工作。

这就是将视图模型连接到视图并查看绑定工作的基础知识。

接下来要学习的内容:

  1. 双向绑定: 如果您在TextBox中设置UI上的值,则需要更新绑定,使其看起来像{Binding FirstName,Mode=TwoWay},例如如果您想输入名字。

  2. 可观察属性: 您会发现另一个问题是当您的视图模型逻辑更改绑定属性的值时,这些值不会显示在UI上。您会为此感到苦恼,而且你会想知道其中的问题,但实际上非常简单。UI需要被通知来更新。您已更改了底层值,但UI不知道如何更新。因此,对于像FirstName这样的属性,您需要在ViewModel上实现INotifyPropertyChanged,并在属性的setter中调用OnPropertyChanged("FirstName")。 有很多描述此内容的示例。

  3. ObservableCollections: 与Observable Properties类似,如果您在视图模型中调整了项目列表,则需要通知视图该列表已更改。方法是将属性变为空ObservableCollection。再次,有许多示例。 我的提示是仅为这些属性实现getter。您希望在构造函数中创建集合一次,或者在属性的getter中进行惰性加载。如果您曾经创建ObservableCollection的新实例,则与UI的链接将断开,您将不得不调用OnPropertyChanged,但如果仅使用单个ObservableCollection实例并将其从中删除项目,则不需要这样做。玩了一会儿,你就会明白我的意思。再次阅读本文。

  4. 转换器: 现在我们正在进入下一个级别,但为了使代码干净,您将利用转换器和Relay Commands。 最常见的转换器是BooleanToVisibilityConverter。 这将根据View Model上的布尔值控制视图组件的可见性。 再次,您必须研究此内容。

  5. Relay Commands: 像转换器一样,您需要Relay Commands来保持代码简洁。 Relay Command基本上是单击事件的绑定。 您将在ViewModel中实现Relay Command,例如Button Command将绑定到View Model上的RelayCommand属性。

一旦您研究并熟悉了这些项,您就可以开始好的开端了。

在某些情况下,避免编写代码很难,但我发现我已经能够找到大多数问题的解决方案。然而,有时需要创造力。

最后一个评论:我创建严格的干净ViewModel的目标是,以便我可以在不同设备之间进行重用(手机和平板电脑)。这是可能的,但深入到更难的问题后就更加困难了。但是,关键在于您必须为您的ViewModels创建一个单独的Lib项目。所有我的解决方案都有Windows Phone 8.1项目、Windows 8.1(Store)项目和Portable类Lib项目。 ViewModels文件夹放入Lib项目中,以及所有其他可共享的代码。为使所有内容正常工作,您可能必须使用Inversion of Control,但这是另一个帖子的主题。

祝好运,玩得开心,

Tom


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接