2012-04-10 5 views
2

WPF + MVVM을 시작했습니다. 나는 내가 기초의 교수형을 가지고있다라고 생각한다. 그러나, 나는 질문이있다 (바보 같은 사람이 아니기를 바랍니다).WPF MVVM 다른 하나에서보기

나는 고객 목록을 보여주는보기가 있습니다. 이 고객 중 한 명을 편집하고 싶습니다. ListViewModel에서 별도의 ViewModel을 사용하여 편집 뷰를로드하려면 어떻게해야합니까?

이것은 꽤 표준적인 시나리오이며, 꽤 직접적인 대답이지만, 나는 인터넷 검색 시간을 쏟아 부었지만 아무 것도 구체적으로 제시하지 못했습니다. 누군가가 직접적인 예를 들어 설명 할 수 있습니까?

내가 잘못해서 간단하지 않은 경우, 이런 유형의 작업을 수행하는 가장 좋은 방법은 무엇입니까?

답변

3

MVVM뿐 아니라 잘 적용되는 일반적인 방법은 목록 VM에 소위 서비스에 대한 액세스 권한을 부여하는 것입니다. 그런 다음이 서비스는 편집기 작성 및 표시를 구현합니다 (아마도 다른 서비스를 사용합니다).

예 :

/// Always use an interface for the service: it will make it a breeze 
/// to test your VM as it decouples it from the actual service implmentation(s) 
interface ICustomerEditorService 
{ 
    /// Do whatever needed to get the user to edit the Customer passed in, 
    /// and return the updated one or null if nothing changed. 
    /// Customer here is likeyly your customer model, or whatever is neede 
    /// to represent the editable data 
    Customer EditCustomer(Customer toEdit); 
} 

class ListViewModel 
{ 
    /// service gets passed to constructor, you can use dependency injection 
    /// like MEF to get this handled easily; 
    /// when testing, pass a mock here 
    public ListViewModel(...., ICustomerEditorService editorService) 
    { 
    .... 
    } 

    private void OnEditButtonClicked() 
    { 
    var editedCustomer = editorService.EditCustomer(GetSelectedCustomer()); 
    //do stuff with editedCustomer 
    } 
} 

/// A real implementation 
class CustomerEditorService 
{ 
    public Customer EditCustomer(Customer toEdit) 
    { 
    var vm = new CustomerEditorViewModel(toEdit); 
    var view = new CustomerEditorView(vm); 
    if(myWindowManager.ShowDialog(view) == Cancel) 
     return null; 
    return vm.Customer; 
    } 
} 
+0

감사합니다. 나는이 일을하고있다. 그러나, 그것을 수행하려면 모든보기를 여는 MainWindowViewModel에 공용 메서드를 만들어야 만했습니다. MVVM에 대해 알고있는 것부터 옳지 않은 것 같습니다. 이 창을 가상 머신에서 멀리 떨어져 있어야합니까? –

+0

네, 그렇게 멀리 추상화해야합니다. 제 예제에서는 어떤 방식 으로든 윈도우를 보여주는 'IWindowManager'서비스가 있습니다. 예를 들어 ShowDialog 메서드는 모든 UserControl (이 경우 편집기 뷰)을 가져 와서 Ok 및 Cancel 단추가있는 모달 창에 넣을 수 있습니다. 간단한 경우 MainWindowViewModel에서 해당 인터페이스를 직접 구현할 수 있습니다. 따라서 여전히 공용 메서드가 있지만 기본 VM을 전달하는 대신 IWindowManager로 전달하여 클라이언트가 구현 세부 정보를 볼 수 없도록합니다. – stijn

+0

삭제 해 주셔서 감사합니다. 건배. –