2011-05-08 84 views
1

我刚刚得到了有关wmf,c#的MVVM的一些设计/实现问题。我只是想试着去和MVVM握手,如果有人能够证实我的想法,我就会徘徊,在我的应用程序中,我需要一个员工,一个部门和一个公司。换句话说,我有一个员工模型和一个相应的员工ViewModel。现在,当用户点击新员工时,会弹出一个窗口,其中包含4件事情2组合框和员工姓名字段以及提交按钮。现在我主要关注的是如何管理2个组合框,一个用于公司,一个用于部门?与WPF握手MVVM

现在我还分别为公司和部门以及视图模型分别创建了两个模型,因为我需要能够添加新的公司或部门。

因此,我的第一个问题归结为我是否在Employee Viewmodel中使用了公司和部门模型,还是将下拉框绑定到公司或部门的单独视图模型?如果是这样,如何获得组合框细节,如果完成第二种方式?

而我的第二个是如果你将一个数据网格绑定到一个可以说EmployeeListViewModel,如果在employeelistviewmodel列表中发生任何更改,该数据网格自动更新,或者我必须调用一个函数,重新检查列表或做我必须重新绑定它?

任何帮助将是巨大的:)

感谢所有

回答

4

不要将员工视图模型视为员工的模型。把它看作是员工观点的一个模型。因此,在员工视图中出现的所有内容都需要存在于视图模型中 - 并且包括在该视图中填充组合框所需的任何内容 - 因此将会有Companies属性和Departments属性,即那些组合框'ItemSource属性将绑定到。

您可能会查看公司和部门的视图模型,这些模型将支持用于显示/修改这些对象的视图。这通常是一个完全不同的问题,而不是在组合框项目中显示这些对象的描述。 (但并非总是如此 - 例如,如果组合框项目在它们绑定的项目发生更改时需要更新,则需要将它们绑定到查看支持属性更改通知的模型。)

就第二个问题而言,如果您有一个ItemsControlItemsSource绑定到视图模型对象集合,只要这些视图模型支持更改通知(这是实现视图模型的主要原因之一),那么,并存储在支持更改通知的集合中(如可观察的集合),同时保持ItemsControl同步发生。

1

你认为有2个组合框将需要公开的公司和部门项目的集合。这些可能只是模型,但如果它被包装在视图模型中,它们会更好。我假定当你选择一个公司时,部门清单将被更新。您可以查看我为Cascading combo boxes建议的解决方案,该解决方案根据其父项的选择更新子项目列表

至少您有一个要组合的项目列表以及所选项目的属性。我使用'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}" /> 

至于入门的基础知识有很多周围的其他职位会走到这一步的,但是组合框设计上应该有所帮助。

对于第二个问题,只要您的ViewModel实现了INotifyPropertyChanged它将更新该对象绑定的控件。

0

我会将公司和部门数据放入员工ViewModel中。 使用公司作为一个例子它

ObservableCollection<CompanyViewModel> ListOfCompanies; 
CompanyViewModel SelectedCompany; 

ListOfCompanies结合到组合框 的的ItemSource和SelectedCompany绑定(双向),以组合框的selectedItem属性我将具有两个属性。 这样,您可以在viewmodel中设置选定的公司,并且它将更新UI,并且UI在更改时也会更新视图模型。

根据您填充ListOfCompanies和SelectedCompany的方式,您可能需要CompanyViewModel来实现以下接口。

IComparable<CompanyViewModel>, IEquatable<CompanyViewModel> 

该绑定将完成剩下的工作。

至于自动更新您的员工datagrid,我更喜欢自己使用ListView,但可观察的employeeViewModels集合应刷新罚款。

这就是我的两个值得。