我刚刚通过wpf,c#获得了MVVM的一些设计/实现问题。我只是试图掌握MVVM并且如果有人可以确认我的想法而徘徊,在我的应用程序中我需要一个员工,一个部门和一个公司设置。换句话说,我有一个员工模型和一个相应的员工ViewModel。现在,当用户单击“新员工”时,将显示一个窗口,其中包含4个组合框,以及员工姓名字段和提交按钮。现在我主要关注如何管理2个组合框,一个用于公司,一个用于部门?
现在我还分别为公司,部门和视图模型设置了两个模型,因为我需要能够添加新的公司或部门。
所以我的第一个问题归结为我在Employee Viewmodel中使用公司和部门模型的事实,还是将下拉框绑定到公司或部门的单独视图模型?如果是这样的话我怎么能得到组合框的详细信息,如果按第二种方式完成?
我的第二个是如果你将一个数据网格绑定到一个,比方说,EmployeeListViewModel,如果在employeelistviewmodel的列表中发生任何更改,那个数据网格会自动更新还是我必须调用一个重新检查列表的函数或者我必须重新绑定它?
任何帮助都会很棒:)
全部谢谢
答案 0 :(得分:4)
不要将员工视图模型视为员工的模型。将其视为员工视图的模型。因此,将在员工视图中显示的所有内容都需要出现在视图模型中 - 并且包括填充该视图中组合框所需的任何内容 - 因此将存在Companies
属性和{{ 1}}这些组合框'Departments
属性将绑定到的属性。
您可能拥有公司和部门的视图模型,它们将支持用于显示/修改这些对象的视图。这通常是与在组合框项目中显示这些对象的描述完全不同的问题。 (但并非总是如此 - 例如,如果组合框项目在它们被绑定的项目发生更改时需要更新,则需要将它们绑定到查看支持属性更改通知的模型。)
就您的第二个问题而言,如果您的ItemSource
ItemsControl
绑定到一组视图模型对象,只要这些视图模型支持更改通知(这是其中之一)实现视图模型的主要原因,并存储在支持更改通知的集合中(如可观察的集合),保持ItemsSource
自动同步。
答案 1 :(得分:1)
具有2个组合框的视图需要公开公司和部门项目的集合。这些可能只是模型,但如果它被包装在视图模型中则更好。我假设当您选择公司时,部门列表将会更新。您可以查看我为Cascading combo boxes建议的解决方案,该解决方案根据其父选择更新子列表
至少要有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
,它就会更新对象绑定的控件。
答案 2 :(得分:0)
我会将公司和部门数据放在员工ViewModel中。 以公司为例,我有两个属性
ObservableCollection<CompanyViewModel> ListOfCompanies;
CompanyViewModel SelectedCompany;
ListOfCompanies绑定到组合框的itemsource 并且SelectedCompany被绑定(twoway)到组合框的selectedItem。 这样,您可以在viewmodel中设置选定的公司,它将更新UI,并且当UI更改时,UI也将更新viewmodel。
根据您填充ListOfCompanies和SelectedCompany的方式,您可能需要CompanyViewModel来实现以下接口。
IComparable<CompanyViewModel>, IEquatable<CompanyViewModel>
绑定将完成其余的工作。
至于自动更新你的员工数据网格,我更喜欢自己使用ListView,但是一个可观察的employeeViewModel集合应该刷新。
这是我的两位价值。