MVVM,ObservableCollection,async等

时间:2014-08-26 05:58:59

标签: c# sqlite windows-phone-8 mvvm

所以,我正在接受我的教育的下一阶段,并且已经达到了与我使用SQLite相关的一些阻碍(这是一个通用的应用程序,目前我的重点是在Windows Phone端那个解决方案)。我的问题在某种程度上与SQLite无关,但我会以它为例。

我正在将SQLite视为我的应用程序的数据库(基于此处和其他地方的各种建议和评论)。具体来说,我正在设计我的观点 - > viewmodel - >模型,我不确定传递ObservableCollection的适当模式。

让我从模型开始。我正在调用SQLite-net的QueryAsync()方法。所以,深埋在模型中我有任何等待对QueryAsync()的调用。生存的方法(为简单起见,让我们称之为GetData())标记为异步。所以,这就是模型。

在视图级别我需要绑定到viewmodel的属性。让我们调用该属性GetDataVM()。因为它是一个属性我使用了一个吸气剂 - 据我所知,我不能在吸气剂中使用等待物。真的吗?鉴于模型中的异步调用 - QueryAsync() - 似乎我需要等待,对吧?

肯定我在这里有一些基本假设错了。但我试图理解的基本原则是当该属性调用包含异步方法的模型中的方法时,我的视图中的控件必须绑定。

我没有发现这很容易解释:)但是,踩到后面,我想要的是非常简单,从概念上讲。我希望控件绑定到一个viewmodel属性,该属性反过来从模型中检索数据,该模型从SQLite中检索数据。

我感到困惑:)

任何帮助都会非常受欢迎(可能首先要澄清我试图实现的目标:)。)

感谢。

3 个答案:

答案 0 :(得分:1)

我有MSDN article on this topic

它的要点是:正如其他人所指出的,读取属性应该是立即操作,而异步操作(一般来说)不是立即操作。

因此,您首先需要做的是确定在加载数据时您的UI将是什么样的。当你的虚拟机加载时,它应该在那个" loading"状态,当数据到达时,VM应更新到" ready"状态(或者#34;错误"如果操作失败则说明状态。)

在我的MSDN文章中,我介绍了NotifyTaskCompletion<T>类型,它几乎只是围绕Task<T>的数据绑定友好包装器。这允许您通过XAML绑定执行状态转换。

答案 1 :(得分:0)

你是对的,吸气剂不是异步的。我也不会试图让它们以这种方式工作。

使用长时间运行的getter和良好实践来将长时间运行的进程包装为等待asyncs被认为是不好的做法。

你可以看到两者不相容的原因。

相反,是否可以从命令触发异步调用?这样你就可以调用异步,只需通过setter将结果分配给属性,该调用器应调用INotifyPropertyChanged PropertyChanged事件来更新你的UI。

答案 2 :(得分:0)

一般来说,ViewModel负责加载模型(当然它可以将此职责传递给存储库类)

这样ViewModel可以包含awaits,Model可以包含包含类的普通数据。

View和ViewModel决定何时将模型与数据源同步。

ViewModel的作用是在Model和View之间进行调解。大多数时候,我没有设计模型,而是接受它作为数据源的给定,并且在许多情况下,模型是通过工具(实体框架,Web服务,......)从合同生成的。所以我对待模型作为一个在数据源发生变化时发生变化的哑数据容器。

View的设计由用户驱动(要求),所以我也无法控制。

我可以在ViewModel中设计和编写View和Model之间的转换,这也是我决定(根据用户和技术要求)何时以及如何加载数据(Model)并将其转换为匹配View所需的结构。

很多时候,实际连接到数据源是在存储库类中编码的,因此ViewModel不知道实际的数据源(连接/技术)这种方式更容易连接到另一个数据源以支持单元测试或实际迁移到另一个数据源。

尝试在每个类/图层中加上一个职责。