使用 WPF 掌握 MVVM
本文关键字:MVVM 掌握 WPF 使用 | 更新日期: 2023-09-27 17:55:19
我刚刚得到了一些关于带有wpf,c#的MVVM的设计/实现问题。我只是想掌握 MVVM,如果有人可以确认我的想法,我就会徘徊,在我的应用程序中,我需要员工、部门和公司成立。换句话说,我有一个员工模型,以及一个相应的员工视图模型。现在,当用户单击"新建员工"时,会弹出一个窗口,其中包含 4 件事 2 组合框和员工姓名字段以及提交按钮。现在我的主要重点是如何管理两个组合框,一个用于公司,一个用于部门?
现在,我还分别有两个公司和部门模型以及视图模型,因为我需要能够添加新的公司或部门。
所以我的第一个问题归结为这样一个事实,即我是在员工视图模型中使用公司和部门模型,还是将下拉框绑定到公司或部门的单独视图模型?如果是这样,如果以第二种方式完成,我将如何获取组合框详细信息?
我的第二个是,如果您将数据网格绑定到一个,比如说,EmployeeListViewModel,如果employeelistviewmodel中的列表中发生任何更改,该数据网格是自动更新还是我必须调用一个重新检查列表的函数,或者我必须重新绑定它?
任何帮助都会很棒:)
谢谢大家
不要将员工视图模型视为员工的模型。 将其视为员工视图的模型。 因此,将出现在员工视图中的所有内容都需要存在于视图模型中 - 这包括在该视图中填充组合框所需的任何内容 - 因此将有一个Companies
属性和一个Departments
属性,这些组合框的ItemSource
属性将绑定到该属性。
您可能具有公司和部门的视图模型,这些模型将支持用于显示/修改这些对象的视图。 这通常与在组合框项中显示这些对象的描述完全不同。 (但并非总是如此 - 例如,如果组合框项在绑定到的项发生更改时需要更新,则需要绑定组合框项才能查看支持属性更改通知的模型。
就第二个问题而言,如果您有一个ItemsControl
,其ItemsSource
绑定到视图模型对象的集合,只要这些视图模型支持更改通知(这是实现视图模型的主要原因之一),并且存储在支持更改通知的集合(如可观察集合)中, 保持ItemsControl
同步会自动发生。
具有 2 个组合框的视图需要公开公司和部门项目的集合。这些可能只是模型,但如果将其包装在视图模型中会更好。我假设当您选择一家公司时,部门列表将更新。您可以查看我为级联组合框建议的解决方案,该组合框根据其父列表的选择更新子列表
您至少有一个 ComboBox 要绑定到的项列表和一个选定项的属性。我使用"ItemListViewModel"将它们组合在一起。
class MyViewModel : INotifyPropertyChanged
{
public MyViewModel()
{
Companies = new ItemListViewModel<string>();
Departments = new ItemListViewModel<string>();
...
}
public ItemListViewModel<string> Companies { get; set; }
public ItemListViewModel<string> Departments { get; set; }
}
在 XAML 中
<ComboBox ItemsSource="{Binding Companies}" />
<ConboBox ItemsSource="{Binding Departments}" />
就基础知识的入门而言,还有很多其他帖子可以达到这一点,但对于 ComboBox 设计,以上应该会有所帮助。
对于第二个问题,只要 ViewModel 实现了INotifyPropertyChanged
它就会更新对象绑定到的控件。
我会将公司和部门数据放在员工视图模型中。以公司为例,我将有两个属性
ObservableCollection<CompanyViewModel> ListOfCompanies;
CompanyViewModel SelectedCompany;
公司列表绑定到组合框的项源并且所选公司绑定(双向)到组合框的选定项。这样,您可以在视图模型中设置选定的公司,它将更新 UI,并且视图模型也将在更改时由 UI 更新。
根据填充公司列表和选定公司的方式,可能需要公司视图模型来实现以下接口。
IComparable<CompanyViewModel>, IEquatable<CompanyViewModel>
绑定将完成其余的工作。
至于自动更新您的员工数据网格,我更喜欢自己使用 ListView,但可观察的员工视图模型集合应该刷新得很好。
这是我的两点价值。