2011-05-08 60 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集合應刷新罰款。

這就是我的兩個值得。