2010-07-29 2 views
5

이 질문은 this older의 후속 조치이며 열린 질문보다 확인 된 것입니다.MVVM에 계층 적 데이터 구조로 편집을 추가하십시오.

내 ViewModel 인스턴스에는 모델의 개인 인스턴스 _modelInst이 있습니다.
ViewModel은 편집하는 동안 모델의 데이터에 독점적으로 액세스하므로 모델에서 INotifyPropertyChanged를 구현할 필요가 없습니다. 얻기

  1. /모델 인스턴스에 직접 설정
    예 :

    이제 세 가지 방법 내가보기에서 모델 데이터를 편집하는 방법에 내놓았다있다 간단한 값 필드
    return _modelInst.fieldname;
    _modelInst.fieldname = value;
    에 대한이 하나의 쉽게 구현할 수 ...

  2. 뷰 모델 인스턴스를 생성 및 부모의 데이터 구조에서 작동
    예를 들어, 해당 유형에 대한 새 뷰 모델을 만들기

    • : 더 복잡한 오브젝트 구조체 같은 유형.
      ViewModel은 부모와 필드 이름을 알고 있습니다. ContentControl에 + DataTemplate을
    • 설정/획득에 그 표시
    • : 단지 하나의 필드가 변경되는 경우에도 전체의 원래 목적을 덮어 파라미터로서 필드 명,
      와 상위의 방법을 통해

    이는 각 구조에 대해 부모가 구현 한 새 인터페이스 (_modelInst에서 작동하는 업데이트 루틴 포함)를 만드는 것을 의미합니다. 부모의 데이터 구조의 직접적인 지식의 ViewModel 인스턴스를 생성


  3. 예를 들어,

    1. 명령을 통해 부모에게 업데이트 지침을 보내는 각 클래스

    2. 에 대한 새로운 뷰 모델을 만들기 부모 클래스

      • 내에서 (목록) 클래스

      • 메시지
      • 반성 (부모는 어떤 자식이 함수를 호출했는지 알고 있습니다.
        )

    ) 저장된 모든 아이들에게이 모든 에 대한 편집 가능한 모델의 모든 분야를 기능을 만들어 구현하는 큰 엉망이다.하나는 각 하위 객체가 부모와의 알고 혼자 반사를 통해 작동하는 일반적인 뷰 모델을 만들 수

(4) 모델의 거의 모든 필드를 의미
... fieldname (목록에있는 경우 + 색인).
루트의 논리 만 모델을 간섭합니다.
그러나 그 해결책은 _modelInst 내의 필드에 경로를 저장하는 방법을 필요로합니다.

이 작업을 수행하는 다른 (더 간단한) 방법이 있습니까?
MVVM의 원칙을 잘못 이해 했습니까?
MVVM은 대형 계층 적 데이터 구조를 조작하는 데 적합합니까?

+0

는 대한 ICommand의 객체를 구현하는 CustomerViewModel을 만들 수 있습니다. 그런 다음보기는 이러한 ICommand 개체에 바인딩해야하며 Customer (가장 가능성있는보기의 어딘가에있는 Binding) 유형의 CommandParameter를 보냅니다. –

+0

평면 구조에서 효과적입니다. 고객 목록그러나'contact contacts'와 같이'contact'가'business, customer, private'에 대한 기본 클래스이고'business'가'list '... 인 트리 구조가 더 복잡한 경우 어떻게 될까요? –

+0

각 모델에 대해 별도의 ViewModel을 사용하고 있습니까? 파생 클래스의 경우,'Business business = contact as Business; if (business! = null) [비즈니스와 관련된 일들]' –

답변

0

이것은을위한 훌륭한 질문 : 내가보기 모델 객체 그래프/계층 구조를 나타내는 접근 MVVM 방법을 배운 그들은 나에게 꽤 도움 MVC 패턴을 가진 좋은 대답이 있다는 것을 느끼지 못합니다.

ViewModels은 매핑되는 모델에 하위 항목이 없을 때 잘 작동합니다.

그러나 모델이

 -->Order 

     -->Country 

고장의 디자인 패턴의 종류 (상상 나라는 고객의 자식 객체이었다) 고객

에로, 아이들이있는 경우.

가장 좋은 점은 상속을 사용하고 뷰 모드 로직이 필요한 아이들 만 선택적으로 노출하는 것입니다. 그렇지 않으면 상속을 통해 들어오는 뷰의 모델 속성 인 에 액세스하면됩니다.

공용 클래스 CustomerView : 고객 // 상속 고객에서 (모델) {

public CustomerView(Customer customer) 
{ 
     this.FirstName = customer.FirstName 
     //etc.. 

     //Only if you need it, that is if you have some display-specific 
     //logic relating to country for a given view, you create 
     //a CountryView class that inherits from Country and gets populated 
     //by an instance of it as well 
     this.CountryView = new CountryView(customer.Country) 
} 

public CountryView CountryView {get;set;} //sadly you cannot override Country but you may be able to shadow it. 

public string DisplayColor 
{ 
    if(base.FirstName == "Joe") 
    { 
     return "red"; 
    } 
    return ""; 
} 

} 손자를 처리 할 때이 지저분

. 누구든지 더 나은 해결책을 가지고 있다면, 나는 그것을 듣고 싶습니다. RetrieveCustomer, CreateCustomer, UpdateCustomer, DeleteCustomer (유형 고객의 각각 복용 매개 변수) : 모델 객체로 고객을 가정

감사