Windows MVVM中的通用应用程序

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

我是MVVM的新手。 我以正常方式开发了Windows phone 8和WP8.1 app。 但不是MVVM。 我搜索了很多,但没有得到任何可以更好地理解MVVM的例子。 我知道什么是MVVM。 它类似于Asp.net的MVC。

MVVM

型号 :描述数据

View-Model :简单来说就是Model和View之间的桥梁。

视图 :简单的xaml页面或用户界面。

哪种方式更好或最好在Windows Phone 8 MVVM或Normal方式下执行代码?

正常方式意味着不使用MVVM。

参考: 使用Model-View-ViewModel模式分离UI和应用程序逻辑

这是一个在一篇文章中回答的广泛问题。 我将提供一些思考和研究的方面。

(注意:这篇文章中的所有代码都是从内存中释放的。它可能不是100%语法正确。)

在MVVM的定义中,大部分都是正确的。 MVVM和MVC之间的主要区别在于绑定用于将View连接到View Model(Controller)。 这虽然是语义,但不需要挂在它上面。

如果你是WP 7,WP 8,WP8.1,Siverlight或Universal App都没关系。 从MVF开始可能最容易,因为引入MVVM时运行应用程序的速度更快,因为它不能在模拟器中运行。

首先是开始一个非常基本的例子。

1)创建文件夹“Views”和“ViewModels”。 严格来说没有必要,但你会想要它们。

2)使用TextBlock创建一个空白页面。 这是带有代码的xaml文件。 在Views文件夹中创建它并将其命名为MyFirstPage。 像这样放一个文本块:

 

3)运行应用程序并确保显示此文本。

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

5)将页面(视图)连接到ViewModel。 这是我的代码背后的样子,在大多数情况下,这就是我所拥有的。 将DataContext设置为视图模型是设置绑定的关键。 还有许多其他框架可以实现这种魔力,但这就是发生的事情。 这是我认为最好的起点。

 public class MyFirstPage : Page { private MyFirstViewModel _viewModel = new MyFirstViewModel(); public MyFirstPage() { this.Initialize??? this.DataContext = _viewModel; } 

6)向View Model添加Title属性,现在让它返回一个硬编码值。

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

7)在View上更新TextBlock以使用Binding

  

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. 转换器 :现在我们正在进入下一个级别,但为了保持代码的清洁,您将利用转换器和中继命令。 最常见的转换器是BooleanToVisibilityConverter。 这将有助于根据视图模型上的布尔值控制视图组件的可见性。 再次,你将不得不研究这个。

  5. 中继命令 :与转换器一样,您需要使用中继命令来保持代码清洁。 relay命令基本上是click事件的绑定。 您不会在后面的代码中使用单击事件处理程序,而是在ViewModel中实现Relay Command,例如,Button Command将绑定到View Model上的RelayCommand属性。

一旦你研究并熟悉这些项目,你将有一个良好的开端。

在某些情况下很难避免代码背后的问题,但我发现我能够找到大多数问题的解决方案,但是,它有时需要创造力。

最后一次评论:我创建一个严格干净的ViewModel的目标是,我可以在各种外形(手机和平板电脑)中重复使用它。 这是可能的,但是一旦你深入研究更难的问题就更难了。 但是,这里的关键是你有一个单独的Lib项目供你的ViewModel使用。我所有的解决方案都有Windows Phone 8.1项目,Windows 8.1(商店)项目和Portable类Lib项目。 ViewModels文件夹将与所有其他可共享的代码一起进入Lib项目。 为了使一切正常,您可能必须使用控制反转,但这是另一篇文章的主题。

祝好运并玩得开心点,

汤姆

在这里查看Nico Vermeir关于MVVM Light的介绍教程http://www.spikie.be/blog/post/2014/06/30/.aspx

答案太大,无法在stackO上发布,所以请按照url:)