用于共享和更新相同类实例的UI和模型

时间:2014-09-03 18:12:58

标签: c# wpf mvvm

我对WPF比较陌生,每当我被要求为我的项目创建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的规则。但是,我还没有找到这三个组件之间应该是什么关联,以及如何对Model的同一个实例进行UIEntriesArray读/写操作。更确切地说,我希望只有一个EntriesArray实例应该由Model更新(只要SQL服务器上有新条目,它就应该获取它们并添加到原始{ {1}}并将这些新条目的属性EntriesArraynewEntrySql设置为NewEntryUi,同时将旧条目的true属性设置为newEntrySql )和false(每当用户最小化窗口时,数组中的所有条目都应将MainWindow的{​​{1}}属性设置为newEntryUi)。

我该如何接近?

1 个答案:

答案 0 :(得分:0)

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

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

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

您的View模型似乎特别关闭,因为您的所有数据都存储在通用"值"集合,以及谁更新什么。您应该更新特定的命名变量和对象类型。来自模型,INotifyPropertyChanged应该负责更新UI。另一方面,对View Model数据执行更新的代码应该调用Model来同时更新你的数据库。

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

回答后续评论:

  1. EntriesArray因为它不是一个好的ViewModel,但它是一个开始。当然尝试在当前系统中填充该角色。我不会让模型创建它。通常,在MVVM中,Views知道View Models,View Models知道Models。没有其他知识存在。

  2. 不,当您在View中创建绑定时,框架会为您订阅该事件。我个人使用并且喜欢this实施。

  3. 触发&#34;新条目&#34;样式事件,您为集合使用ObservableCollection<T>,并将ItemsSource属性绑定到它。该集合实现INotifyCollectionChanged,框架将更新ListBox或您绑定到ObservableCollection<T>的任何控件。

  4. 如果你有一个Entry课程,有一个&#34; New&#34;在创建时设置为true的属性(并使用该属性使其变为粗体),这很好。重复检查应作为数据验证的一部分进行,我不会看到标志在哪里为您提供任何信息。

  5. 通常,您需要记住,在MVVM中,视图中的所有内容都由视图模型中的某些数据驱动。您正在寻找您的编程模型&#34; world&#34;在对象中,然后可以将控件绑定到显示。