【问题标题】:How to implement MVVM in Xamarin.Forms with SQLite to populate a Listview who need INotifyPropertyChanged/Icommand in each row如何使用 SQLite 在 Xamarin.Forms 中实现 MVVM 以填充每行中需要 INotifyPropertyChanged/Icommand 的 Listview
【发布时间】:2018-03-30 10:04:52
【问题描述】:

我的模型 A 具有一些属性,我从 REST Web 服务接收数据,我使用 SQlite 进行本地缓存。使用 SQLite api,我可以使用 mi class A 自动创建表并在检索数据后。没关系

现在我需要将这些数据作为列表来填充列表视图,例如带有检查(完成 - 未完成)的 Todo-Item 以在每次用户点击“漂亮的检查图像”时更新布尔值,所以我需要 INotifyPropertyChanged按行

我认为我的选择是:

1) 使用 SQlite api 检索整个列表,我将得到一个列表。但我在这里没有 INotifyPropertyChanged 更改。所以我应该将整个列表转换为将实现 INotifyPropertyChanged 和 ICommand 的列表。这将增加额外的过程。但我认为我得到的更好

2) 直接从 Model 继承 ViewModel,这样我就可以直接从 SQLite.net 检索 List,但我应该在 sqlite 客户端中执行另一种方法来检索这种特定的方式。我也会从 Model 和 ViewModel 访问 SQLite,我认为不应该这样做

3) 将 INotifyPropertyChanged 和 ICommand 添加到模型中...

我尝试了这 3 种方法,但我真的不喜欢生成的代码。 是否有其他方法或建议来改进当前选项?

【问题讨论】:

    标签: sqlite listview mvvm xamarin.forms


    【解决方案1】:

    在您的情况下,最好的方法是为列表项创建一个ViewModel,它将实现INotifyPropertyChanged 并包含ICommand 字段,并使用来自Model 的数据对其进行初始化(无论是通过ctor 或通过创建 factory)。这样,您将获得实现所有必需功能的ViewModels 列表。
    这是一种很常见的方法。

    【讨论】:

    • 因此,对于检索项目,正确的方法将来自页面的 ViewModel,调用 SQLite 客户端,我将在其中收到 List 并在转换为 List 之后立即看到它。一个 ListItemViewModel 类,我可以在其中实现列表 INotifyPropertyChanged 也将每个 ItemModel 解析为 ItemViewModel ...下一步填充 ListView 对吗?你同意吗?
    • @RicardoAlvarezCastillo,我完全同意将List<ItemModel> 转换为List<ItemViewModel> 的部分。通常这是通过具有 ItemViewModel Convert(ItemModel) 方法的 Factory 类完成的。
    • @RicardoAlvarezCastillo,也许我错过了什么?为什么你希望List 实现INotifyPropertyChanged?实现它的应该是ItemViewModel
    • 你说得对,我的主要问题是 ItemViewModel 详细信息更新。但是,如果我想更新列表...我将监视 REST 数据源的更改,并且我可以检测到要包含在列表中的新项目(我可以使用本地存储数据启动应用程序,并且当远程数据可用时更新包含更改的列表。应该是新项目,永远不会低于当前项目)。我可以同时做 INotifyPropertyChanged 对吗?
    • @RicardoAlvarezCastillo,我猜你要找的是ObservableCollection<ItemViewModel>。它同时实现了INotifyPropertyChanged(通知CountItem[] 更改)和ICollectionChanged(通知视图添加新项目或删除现有项目)。
    猜你喜欢
    • 2015-12-16
    • 2018-03-29
    • 2010-11-30
    • 1970-01-01
    • 2017-04-03
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多