UI和模型来共享和更新同一个类实例

本文关键字:同一个 实例 更新 共享 模型 UI | 更新日期: 2023-09-27 18:20:42

我对WPF相对陌生,每当我被要求为我的项目创建UI时,我都会做一些有效的事情,但我几乎不认为这是书中所做的。

现在我有一个项目,其中我有三个(主要)组件:

  • UI(MainWindow
  • 保存数据的自定义类(让我们称之为EntriesArray类)
  • 从SQL获取数据的引擎(Model

EntriesArray类有一些属性,如下所示:

internal class EntriesArray
    {
        public string[] values { get; set; }
        public bool newEntrySql { get; set; }
        public bool newEntryUi { get; set; }
    }

我试着搜索我应该如何组织这个应用程序,发现它可能使用MVVM的规则。然而,我还没有发现这三个组件之间的确切相关性,以及如何使ModelUIEntriesArray的同一实例进行读/写。更确切地说,我只想有一个EntriesArray实例,它应该由Model(每当SQL server上有新条目时,它都应该获取它们并添加到原始EntriesArray,并将这些新条目的属性newEntrySqlNewEntryUi都设置为true,同时将旧条目的newEntrySql属性设置为false)和MainWindow更新(每当用户最小化窗口时,数组中的所有条目都应将EntriesArraynewEntryUi属性设置为false)。

我该怎么做?

UI和模型来共享和更新同一个类实例

你有点在正确的轨道上,但这种方法有点偏离。

视图和模型是正确的,但听起来与视图模型有点混淆。视图模型保存并管理要显示的UI的所有数据。它还充当UI对模型进行操作(通过命令)的中间人。

UI通常会创建视图模型的实例,然后创建模型的实例或使用Locator模式获取现有实例。在理想的情况下,模型不了解视图模型,模型只响应函数调用并引发事件。

您的视图模型似乎特别糟糕,因为您的所有数据都存储在一个通用的"值"集合中,以及谁更新了什么。您应该更新特定的、命名的变量和对象类型。来自模型的INotifyPropertyChanged应该负责更新UI。反过来说,对视图模型数据执行更新的代码应该同时调用模型来更新数据库。

如果你需要澄清,请告诉我。

对后续意见的答复:

  1. 目前的EntriesArray不是一个好的ViewModel,但它只是一个开始。这当然是试图填补您当前系统中的角色。我不会让模型创建它。一般来说,在MVVM中,视图知道视图模型,视图模型知道模型。不存在其他知识。

  2. 否,当您在视图中创建绑定时,框架会为您订阅该事件。我个人使用并喜欢这种实现。

  3. 要触发"New entry"风格的事件,您可以为集合使用ObservableCollection<T>,并将ItemsSource属性绑定到该集合。该集合实现INotifyCollectionChanged,框架将更新ListBox或您绑定到ObservableCollection<T>的任何控件。

  4. 如果您有一个Entry类,它的"New"属性在创建时设置为true(并使用该属性使其变为粗体),那也没关系。重复检查应该作为数据验证的一部分来完成,我看不出标志能给你带来什么。

通常,您需要记住,在MVVM中,视图上的所有内容都是由视图模型中的一些数据驱动的。您希望在对象中建模您的编程"世界",然后可以将控件绑定到这些对象以进行显示。