我对WPF比较陌生,每当我被要求为我的项目创建UI时,我都做了一些有用的工作,但我觉得这本书完全没有。
现在我有一个项目,我有三个(主要)组件:
MainWindow
)EntriesArray
类)Model
)EntriesArray类有一些属性,如下所示:
internal class EntriesArray
{
public string[] values { get; set; }
public bool newEntrySql { get; set; }
public bool newEntryUi { get; set; }
}
我试图搜索我应该如何组织这个应用程序,并发现它可能使用MVVM的规则。但是,我还没有找到这三个组件之间应该是什么关联,以及如何对Model
的同一个实例进行UI
和EntriesArray
读/写操作。更确切地说,我希望只有一个EntriesArray
实例应该由Model
更新(只要SQL服务器上有新条目,它就应该获取它们并添加到原始{ {1}}并将这些新条目的属性EntriesArray
和newEntrySql
设置为NewEntryUi
,同时将旧条目的true
属性设置为newEntrySql
)和false
(每当用户最小化窗口时,数组中的所有条目都应将MainWindow
的{{1}}属性设置为newEntryUi
)。
我该如何接近?
答案 0 :(得分:0)
你是有点在正确的轨道上,但这种方法有点偏。
你有正确的视图和模型,但听起来有点与 View Model 混淆。 View Model保存并管理要显示的UI的所有数据。它还充当您的UI作用于模型的中间人(通过命令)。
您的UI通常会创建视图模型的实例,然后创建模型的实例,或使用定位器模式获取现有实例。在理想的世界中,模型不了解视图模型,模型只响应函数调用并引发事件。
您的View模型似乎特别关闭,因为您的所有数据都存储在通用"值"集合,以及谁更新什么。您应该更新特定的命名变量和对象类型。来自模型,INotifyPropertyChanged
应该负责更新UI。另一方面,对View Model数据执行更新的代码应该调用Model来同时更新你的数据库。
如果您需要澄清,请告诉我。
回答后续评论:
EntriesArray
因为它不是一个好的ViewModel,但它是一个开始。当然尝试在当前系统中填充该角色。我不会让模型创建它。通常,在MVVM中,Views知道View Models,View Models知道Models。没有其他知识存在。
不,当您在View中创建绑定时,框架会为您订阅该事件。我个人使用并且喜欢this实施。
触发&#34;新条目&#34;样式事件,您为集合使用ObservableCollection<T>
,并将ItemsSource
属性绑定到它。该集合实现INotifyCollectionChanged
,框架将更新ListBox
或您绑定到ObservableCollection<T>
的任何控件。
如果你有一个Entry
课程,有一个&#34; New&#34;在创建时设置为true的属性(并使用该属性使其变为粗体),这很好。重复检查应作为数据验证的一部分进行,我不会看到标志在哪里为您提供任何信息。
通常,您需要记住,在MVVM中,视图中的所有内容都由视图模型中的某些数据驱动。您正在寻找您的编程模型&#34; world&#34;在对象中,然后可以将控件绑定到显示。