Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM、ObservableCollection、async等_C#_Sqlite_Windows Phone 8_Mvvm - Fatal编程技术网

C# MVVM、ObservableCollection、async等

C# MVVM、ObservableCollection、async等,c#,sqlite,windows-phone-8,mvvm,C#,Sqlite,Windows Phone 8,Mvvm,因此,我进入了教育的下一个阶段,在使用SQLite方面遇到了一些障碍(这是一个通用应用程序,我目前的重点是解决方案的Windows Phone端)。我的问题在某种程度上与SQLite无关,但我将以它为例 我将SQLite视为我应用程序的数据库(基于这里和其他地方的各种建议和评论)。具体来说,我正在设计我的视图->视图模型->模型,我不确定传递ObservableCollection的合适模式 让我从模型开始。我正在调用SQLite net的QueryAsync()方法。因此,在模型的深处,我有任

因此,我进入了教育的下一个阶段,在使用SQLite方面遇到了一些障碍(这是一个通用应用程序,我目前的重点是解决方案的Windows Phone端)。我的问题在某种程度上与SQLite无关,但我将以它为例

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

让我从模型开始。我正在调用SQLite net的QueryAsync()方法。因此,在模型的深处,我有任何关于QueryAsync()调用的等待。它所在的方法(为了简单起见,我们称之为GetData())标记为async。这就是模型

在视图级别上,我需要绑定到viewmodel的属性。让我们调用该属性GetDataVM()。因为它是我使用getter的一个属性,而且,据我所知,我不能在getter中使用wait。这是真的吗?考虑到模型-QueryAsync()中的异步调用,我似乎需要等待,对吗

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

我不觉得这很容易解释:)但是,退一步说,我想要的是非常简单的,概念上的。我想要一个控件绑定到viewmodel属性,该属性反过来从模型检索数据,该模型从SQLite检索数据

我很困惑:)

任何帮助都将不胜感激(可能首先要澄清关于我到底想达到什么目的的问题:)


谢谢。

你说得对,getter不是异步的。我也会避免尝试黑客让他们那样工作

使用长时间运行的getter被认为是不好的做法,而将长时间运行的进程包装为可等待的异步则被认为是好的做法

你可以看到为什么这两个不兼容


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

通常,ViewModel负责加载模型(当然,它可以将此责任传递给存储库类)

这样,ViewModel可以包含等待,并且模型可以由包含类的普通数据组成

视图和视图模型决定何时与数据源同步模型

ViewModel的作用是在模型和视图之间进行调解。大多数情况下,我不设计模型,而是接受它作为数据源的给定值,并且在许多情况下,模型是由工具(实体框架、Web服务等)根据契约生成的,因此我将模型视为一个哑数据容器,当数据源发生变化时,它会发生变化

视图的设计是由用户(需求)驱动的,所以我也不能控制它

ViewModel是我设计和编码视图和模型之间转换的地方,因此我也决定(根据用户和技术要求)何时以及如何加载数据(模型)并将其转换为视图所需的结构

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

试着在每一个班级/每一层都安排一个责任。

我有一个责任

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

因此,您首先需要做的是确定加载数据时UI的外观。当您的虚拟机加载时,它应该在“加载”状态下初始化数据,当数据到达时,虚拟机应该更新到“就绪”状态(如果操作失败,则更新到“错误”状态)


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

谢谢。这是我一路上错过的,我感谢你的澄清。我假设模型是“持久性”层,负责加载方面(在我的例子中是SQLite,从持久性存储)。因此,我假设对QueryAsync的调用因此属于模型(而不是viewmodel),然后将其公开给viewmodel“消费”。您似乎在说与SQLite的交互属于ViewModel,它的作用是在模型中创建实例?还是我又完全错过了呢?:)“谢谢你。”我补充了我的回答:“谢谢你。”。我还没有掌握命令:)但是,在我这么做之前,我应该澄清的一件事是,由于我的数据集很小,我现在编写的代码中的目标只是用SQLlite中持久化的数据预填充模型。我曾假设此检索(通过QueryAsync)将属于模型,但之前的回答表明,我的假设很差,viewmodel应该检索该数据(并填充模型)。但是,在最基本的层面上,我真正想做的就是从SQLite中检索数据,QueryAsync是一个异步调用。感谢您的澄清,然后您可以考虑将数据加载交给co