2011-05-08 3 views
1

방금 ​​wpf, C#을 사용하여 MVVM에 대한 몇 가지 설계/구현 질문을 얻었습니다. MVVM을 사용하려고 할 뿐이며 누군가 내 아이디어를 확인할 수있는 경우 방황하고있었습니다. 신청서에 직원, 부서 및 회사가 필요합니다. 즉, 저는 직원 모델과 해당 사원 ViewModel을 가지고 있습니다. 이제 사용자가 New Employee를 클릭하면 콤보 박스 2 개와 직원 이름 필드와 제출 버튼이 4 개있는 창을 표시합니다. 이제는 두 개의 콤보 상자를 관리하는 방법에 중점을 둡니다. 하나는 회사 용이고 다른 하나는 부서 용입니다.WPF로 MVVM 그립하기

이제는 회사 나 부서를 추가 할 수 있어야하기 때문에 회사 및 부서와 뷰 모델에 대한 두 가지 모델이 있습니다.

그래서 내 첫 번째 질문은 종업원 용 뷰 모델에서 회사 및 부서 모델을 사용했는지 또는 회사 또는 부서 용 별도의 뷰 모델에 드롭 다운 상자를 바인딩합니까? 그렇다면 두 번째 방법을 수행하면 어떻게 콤보 상자 정보를 얻을 수 있습니까?

내 두 번째는 DataGrid를 EmployeeListViewModel에 바인딩하면 employeelistviewmodel의 목록에서 변경이 발생하면 해당 DataGrid가 자동으로 업데이트되거나 목록을 다시 검사하거나 함수를 호출해야합니까? 나는 그것을 다시 바인딩해야 ??

어떤 도움을 회사와 부서 항목의 컬렉션을 노출해야하는 2 콤보를 가지고 모든

답변

4

직원보기 모델을 직원의 모델로 생각하지 마십시오. 직원보기의 모델로 생각하십시오. 따라서 직원보기에 표시 될 모든 항목이보기 모델에 있어야하며 해당보기에서 콤보 상자를 채우는 데 필요한 항목이 모두 포함되어 있으므로 Companies 속성과 Departments 속성이 해당 콤보 상자에 표시됩니다 'ItemSource 속성이에 바인딩됩니다.

회사 및 부서의보기 모델이있어 해당 개체를 표시/수정하는 데 사용되는보기를 지원할 수 있습니다. 이것은 일반적으로 콤보 상자 항목에서 해당 개체에 대한 설명을 표시하는 것과는 완전히 다른 문제입니다. (항상 그런 것은 아니지만 - 예를 들어, 바인딩 할 항목이 변경 될 때 콤보 상자 항목을 업데이트해야하는 경우 속성 변경 알림을 지원하는 모델을 볼 수 있도록 바인딩해야합니다.)

ItemsControlItemsSource이 뷰 모델 개체 컬렉션에 바인딩되어있는 경우 두 번째 질문이가는 한, 해당 뷰 모델이 변경 알림을 지원하는 한 (뷰 모델을 구현하는 주된 이유 중 하나임) 변경 알림 (관찰 가능한 컬렉션과 같은)을 지원하는 컬렉션에 저장되어 ItemsControl이 자동으로 동기화되도록 유지합니다.

1

로보기 좋은 :)

감사 할 것이다. 이것들은 단순한 모델이 될 수 있지만 뷰 모델 안에 감싸 져 있으면 더 좋습니다. 부서 목록이 업데이트 될 회사를 선택할 때 가정합니다. 부모 항목을 기준으로 하위 목록을 업데이트하는 Cascading combo boxes에 대한 해결책을 살펴볼 수 있습니다.

적어도 ComboBox를 바인딩 할 항목 목록과 선택한 항목의 속성 목록이 있습니다. 나는 그들을 함께 그룹화하기 위해 'ItemListViewModel'을 사용한다.

<ComboBox ItemsSource="{Binding Companies}" /> 
<ConboBox ItemsSource="{Binding Departments}" /> 

지금까지와 같은 XAML

에서

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; } 
} 

이 시점에 얻을 것이다 그 주변의 다른 게시물의 많은이 기본으로 시작하지만, 콤보 상자를 위해 도움이 위를 설계하기.

ViewModel이 INotifyPropertyChanged을 구현하는 한 두 번째 질문은 개체가 바인딩 된 컨트롤을 업데이트합니다.

0

직원 ViewModel에 회사 및 부서 데이터를 입력합니다. 콤보 상자의 selectedItem가에

ObservableCollection<CompanyViewModel> ListOfCompanies; 
CompanyViewModel SelectedCompany; 

ListOfCompanies이 콤보 의 itemsource에 바인딩하고 SelectedCompany가 (양방향)을 바인딩에 대한 예를 들어 사용 회사는 내가 두 가지 속성을 가지고있다. 그런 식으로 뷰 모델에서 선택한 회사를 설정할 수 있으며 UI가 업데이트되고 UI가 변경되면 뷰 모델도 업데이트됩니다.

ListOfCompanies 및 SelectedCompany를 채우는 방법에 따라 다음 인터페이스를 구현하려면 CompanyViewModel이 필요할 수 있습니다.

IComparable<CompanyViewModel>, IEquatable<CompanyViewModel> 

바인딩은 나머지를 수행합니다.

직원 DataGrid를 자동으로 업데이트하는 경우 ListView를 직접 사용하는 것이 좋지만 관찰 가능한 employeeViewModels 컬렉션은 정상적으로 새로 고쳐야합니다.

그게 내 2 비트 가치입니다.