2012-04-10 27 views
2

私はWPF + MVVMを使い始めています。私は基本のハングアップを持っていると思う。しかし、私は質問がある(うまくいけば愚かなものではない)。WPF MVVM別のビューから開く

私は顧客のリストを示す表示があります。これらの顧客の1人を編集したいと思います。別のViewModelで編集ビューをリスト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上でパブリックメソッドを作成してすべてのビューを開く必要がありました。私は、このウィンドウを抽象化してそのVMから開放する必要がありますか? –

+0

はい、あなたはそれを抽象化する必要があります。私の例では、何らかの方法でウィンドウを表示できる「IWindowManager」サービスがあります。たとえば、ShowDialogメソッドは、任意のUserControl(この場合はエディタView)を取得し、それをOkおよびCancelボタンを持つモーダルウィンドウに配置できます。単純なケースでは、MainWindowViewModelにそのインタフェースを直接実装させることができます。したがって、それはまだパブリックメソッドを持っていますが、メインVMをIWindowManagerとして渡す代わりに、クライアントは実装の詳細を見ることができません。 – stijn

+0

これをクリアしていただきありがとうございます。乾杯。 –

関連する問題