6

私が間違っていると思うMVVMパターンに関する質問。

ビューでタッチダウンイベントが発生すると、メッセージをポップアップしたい:

private void marker_TouchDown(MessageObject msgData)
{
    CustomMessageControl message = new CustomMessageControl() {Width = 610, Height = 332};
    CustomMessageViewModel messageVM = new CustomMessageViewModel(msgData);
    message.DataContext = messageVM;
    //Add to canvas
}

私のビューモデル:

public class CustomMessageViewModel
{
    public MessageObject message { get; set; }

    public CustomMessageViewModel(MessageObject message)
    {
        this.MessageObject = message;
    }
}

これは機能しますが、気分が良くありません。これは、ビュー モデルを作成するための受け入れ可能な方法ですか?

4

1 に答える 1

2

ビューモデルでコントロールを作成する際にMVVMに違反していると思います。これはテストできません。ビュー モデル今すぐコントロールを作成する必要があり、それはテストの要件ではありません (これは、UI とビュー モデルの間の関心の分離の欠如を強調しています)。

コントロールを作成する代わりに、ビュー モデルが独自のイベントを発生させることは完全に許容されます。このイベントでは、次のように、ダイアログ/オーバーレイ/コントロールをバインドするビュー モデルを渡します。

public class CustomMessageControlEventArgs : EventArgs
{
    public CustomMessageViewModel CustomMessageViewModel { get; set; }
}

public event EventHandler<CustomMessageControlEventArgs> 
    ShowCustomMessageControl;

private void marker_TouchDown(MessageObject msgData)
{
    // Create the view model.
    var message = ...;

    // Get the events.
    var events = ShowCustomMessageControl;

    // Fire.
    if (events != null) events(this, 
        new CustomMessageControlEventArgs {
            MessageObject = new CustomMessageViewModel(msgData)
        });
}

次に、UI コードでイベントにバインドし、そのイベントに適したユーザー インターフェイスを表示します。

MVVM は厳密には、XAML ですべてを宣言できることや、データ バインディングだけでデータを UI にバインドできることではなく、コードを適切に分離することを目的としていることを思い出してください。

を表示するか (ビュー モデル) をどのように表示するか (UI)から分離する必要があります。イベントを発生させることで、関心の分離を維持しています。

はい、いくつかのコード ビハインドを作成する必要があります (または、プロパティ通知の変更を介して作成することもできますが、率直に言って、それはより醜いです)。しかし、これにより分離が維持され、ユーザー インターフェイス要素を持ち込むことなく簡単にテストできます。

于 2012-11-06T20:02:02.060 に答える