4

注意:请原谅我的英语。这不是我的母语 - 我有时拼写错误或使用错误的时间

情况描述

首先,我将描述情况。

我正在开发一个 Windows Phone 8 应用程序(WP8.0 w/ .NET 4.5 in C#/XAML)。这是我的第一个 WP8 应用程序,我周围没有多少人可以帮助我,所以我是从网上的教程和几本书中自己学习的(换句话说,我是菜鸟,没有那么多经验)。

我从Web服务(我将在后面描述)收集的数据量“不是那么大” ,我决定使用Model-View-ViewModel (MVVM) 来存储它提供的数据。

MVVM 结构:

这只是我的 MVVM 结构的伪图,描述在它下面

MainViewModel
--------------
|
+ several properties (Username, Password, etc...)
|
+ Commands (loadData1, loadData2, flush, ...  - implementations of ICommand)
|
+ ------ PersonalInfoModel
|        -----------------
|        + several properties (name, surname, phonenumber, etc...)
|
|             
+ ------ DataGroup1Model
|        ---------------
|        +several properties
|        +ObservableCollection<Item1> (roughly 0 - 50 items)
|        +ObservableCollection<Item2> (roughly 0 - 5 items)
|        +ObservableCollection<string> (roughly 0 - 5 items)
|        
|                  Item1                         Item2
|                  -----                         -----
|                  +several properties           +several other properties
|                  
|
+ ------ DataGroup2Model (similar to previous)
...et cetera...

我有MainViewModel对象,其中包含很少的属性和命令(实现 ICommand)以及几个模型,其中包含其他属性和 observablecollections。

MainViewModel 不是一次填充数据,而是随着用户浏览应用程序并请求它的时间而填充。主要是因为有更多的网络服务可以从中收集 - 一些数据必须根据用户指定的标准收集(例如从哪个日期到哪个日期等)

我决定创建一个“持久(不确定是否是正确的词)ViewModel,它将出现在整个应用程序中,因为我有时需要在页面中组合来自多个模型的数据

例如,我需要始终在页面上始终显示的“userInfoBar”中显示一些基本用户信息 + 我需要一些来自 DataGroup1Model 的信息和一些来自 DataGroup2Model 的信息(这些信息由来自两个 Web 服务的数据填充,并用于更多组合,然后就是这个一)。

网页服务

我正在使用 web 服务来收集数据以填充 viewModel。特别是一个具有 9 种方法的 web 服务,不知道如何描述它 - 每一种方法都给我一些关于某事的数据,这些数据我存储在 datagroupModels 中(有时是两个 datagroupmodels,如personalinfoModel 和 Datagroup1Model)。

网络服务已提供给我,我无法更改它们,我只能使用它们。

问题”

我正在尝试找出一种向我的页面发出信号表明某事已完成的好方法。例如登录顺序:

  1. 我有一个页面,其中包含两个 TextBoxes,其值绑定到MainViewModel属性UserNamePassword以及一个绑定到MainViewModel中的Command Login的Button 。

  2. login 命令只是启动“ doLogin ”方法,该方法使用用户名密码属性并将其作为凭据提供给在添加 web 服务时由 Visual Studio 自动生成的webserviceclient实例,并且客户端执行其中一种 web 服务方法(异步方法) - 对于示例登录。

  3. 当此方法完成时,它会引发与其关联的Completed 事件并在其CompletedArguments中提供Result对象。

  4. 在完成的事件中,我将数据从 Result 对象复制到 viewModel。

此时,最好向 UI 发出一些信号,表明登录任务已完成并且应该导航到另一个页面。

我该怎么做?

有一些首选的方法吗?

PS:如果您对此处描述的内容有任何建议,我将很高兴听到它们。还请记住,我是一个菜鸟,所以我有时需要解释傻瓜或卡在一些基本和/或愚蠢的事情上。

4

3 回答 3

2

通常,您只需更改数据即可从视图模型通知 UI。例如,您可以在State绑定到 UI 的属性中维护一些通用“状态”。然后,UI 可以根据该属性的值显示不同的内容。您通常使用数据触发器来执行此操作。如果它不那么复杂,你也可以只用一个布尔值来告诉你IsDataLoaded什么,即如果你已经从 web 服务加载了数据。或者更简单,如果你想在视图中显示结果,你只需要Result绑定一个属性。只要您尚未加载数据,该值为 null 并且视图将显示登录表单。如果数据不为空(即数据已加载),它将只显示数据。

至于导航,通常导航的每个页面都有自己的视图模型。因此,如果您从登录屏幕开始,您将拥有一个“登录视图模型”,如果下一页是数据可视化,您将拥有一个“数据视图模型”。通常这是使用数据模板完成的。数据模板是依赖于类型的模板。您将拥有一个“元”视图模型,它基本上只有一个用于当前显示的视图模型的插槽。然后对于每种可能的类型,您将定义一个数据模板,为特定的视图模型类型定义其视图。然后导航,您所做的就是更改元视图模型中的当前视图模型。

于 2013-10-15T09:15:36.953 回答
2

如果通知需要到相同的视图/视图模型,则执行 INotifyPropertyChanged 来获取通知就足够了。因此,通常您会更新 Success 属性,该属性反过来也会调用属性更改事件。

或者,如果此登录通知需要跨模块传送。让状态向不同的模块(在实施时不知道的模块)发出通知。可以使用发布订阅模型。 https://msdn.microsoft.com/en-us/magazine/dn745866.aspx展示了如何使用 MVVM Ligths 发布机制。

也可以探索 Prisms EventAggregator。

于 2015-03-24T03:42:07.950 回答
1

我建议您查看 prism http://compositewpf.codeplex.com/ 这允许您在整个应用程序中发布事件或聚合命令,并轻松切换 beetween 视图。您必须阅读大量文档,但这是值得的,我无法想象现在没有它开发强大的 mvvm 应用程序

于 2013-10-15T09:17:53.843 回答