C# 用于共享和更新同一类实例的UI和模型

C# 用于共享和更新同一类实例的UI和模型,c#,wpf,mvvm,C#,Wpf,Mvvm,我对WPF比较陌生,每当我被要求为我的项目创建UI时,我都会做一些有用的事情,但我几乎不认为这是书上写的 现在我有一个项目,其中我有三个(主要)组件: 用户界面(main窗口) 保存数据的自定义类(我们称之为EntriesArray类) 从SQL获取数据的引擎(模型) EntrieArray类具有一些属性,如下所示: internal class EntriesArray { public string[] values { get; set; } p

我对WPF比较陌生,每当我被要求为我的项目创建UI时,我都会做一些有用的事情,但我几乎不认为这是书上写的

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

  • 用户界面(
    main窗口
  • 保存数据的自定义类(我们称之为
    EntriesArray
    类)
  • 从SQL获取数据的引擎(
    模型
EntrieArray类具有一些属性,如下所示:

internal class EntriesArray
    {
        public string[] values { get; set; }
        public bool newEntrySql { get; set; }
        public bool newEntryUi { get; set; }
    }
我试图搜索我应该如何组织这个应用程序,发现它可能使用MVVM的规则。但是,我还没有找到这三个组件之间的确切相关性,以及如何使
模型和
UI
读/写到同一个
entriesaray
实例。更准确地说,我只希望有一个
EntriesArray
实例,它应该由
模型
(每当SQL server上有新条目时,它都应该获取它们并将其添加到原始的
EntriesArray
,并将这些新条目的属性
newEntrySql
NewEntryUi
设置为
true
,同时将旧条目的
newEntrySql
属性设置为
false
)以及
main窗口
(每当用户最小化窗口时,数组中的所有条目都应将
EntriesArray的
newEntryUi
属性设置为
false

我应该如何接近这一点呢?

你的思路是对的,但这种方法有点偏离

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

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

您的视图模型似乎特别不适用,因为您的所有数据都存储在通用的“值”中集合,以及谁更新了什么。您应该更新特定的命名变量和对象类型。从模型开始,
INotifyPropertyChanged
应该负责更新UI。从另一方面来说,对视图模型数据执行更新的代码应该同时调用模型来更新数据库

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

对后续意见的答复:

  • EntriesArray
    目前来看,它不是一个好的视图模型,但它是一个开始。它肯定是在尝试在当前系统中扮演这个角色。我不会让模型创建它。一般来说,在MVVM中,视图知道视图模型,视图模型知道模型。不存在其他知识

  • 不,当您在视图中创建绑定时,框架会为您订阅事件。我个人使用并喜欢实现

  • 触发“新条目”样式事件中,您对集合使用
    ObservableCollection
    ,并将
    ItemsSource
    属性绑定到它。该集合实现
    INotifyCollectionChanged
    ,框架将更新
    列表框
    或您绑定到
    ObservableCollection
    的任何控件

  • 如果您有一个
    Entry
    类,并且在创建时将“New”属性设置为true(并使用该属性将其加粗),这很好。重复检查应该作为数据验证的一部分来完成,我看不出标志从何而来


  • 一般来说,您需要记住,在MVVM中,视图上的所有内容都是由视图模型中的一些数据驱动的在对象中,您可以将控件绑定到以显示。

    #1当前我的模型初始化EntriesArray的一个实例。是否应该反过来?我的EntriesArray是否可以称为ViewModel?#2我检查了INotifyPropertyChanged上的MSDN,但看不到如何使用它。我是否以某种方式订阅了该事件?3如果我使用INot如果PropertyChanged,它是否能够在有新条目时触发事件,而不仅仅是在它发生变化时?#4我引入了newEntry属性,以便能够执行以下操作:如果newEntryUi为true,则以粗体显示条目;检查现有条目(newEntrySql false)和新条目(newEntrySql true)之间是否存在重复项.是否应该采取不同的做法?@śmiglidigli查看更新,如果您仍然感到困惑,请告诉我。Bradley,MVVM中的模型是一个愚蠢的DTO。它不响应函数调用或引发的事件。谢谢。似乎比我想象的更复杂。我想我需要寻找一些(至少是基本的)MVVM教程,这一次仍然采用DIY方式,因为它需要快速完成:)