1

ViewModelが追加のダイアログを開くことに本当に問題がありますか?MainViewとMainViewModelがあるとしましょう。MainViewModelはMainViewのデータコンテキストであり、実際には、メインビュー自体を認識していないか、依存関係がありません。

ただし、メインビューがViewModelデータに影響を与えるダイアログを開く必要がある場合があります。たとえば、ユーザーが選択できるように、ダイアログを表示していくつかのアイテムを表示したい場合があります。だから、私が決めたのはこれです:

私のViewModelには、、、、およびのメソッドがありAddItemます。ただし、追加または編集するアイテムを提供するには、ユーザーが選択できるように、いくつかのダイアログにリストを表示する必要があります。現在、このような単純なタスクに追加レベルの抽象化を実装したくないという理由だけで、ViewModelにこれを実行させています。ViewModelにこれを実行させると、ユーザーに表示するリストを提供でき、ユーザーが編集または選択を終了したときに、メンバーのコレクション/プロパティを簡単に更新できます。EditItemDeleteItem

このアプローチで落ち着くために撃たれるべきですか?

4

5 に答える 5

4

ショット?いいえ。しかし、これを行わないのには十分な理由があります。

まず、ビジュアルコンポーネントが配置されているため、ViewModelのテスト可能性が失われます。それに対して自動化された単体テストを作成しようとする場合でも、それを操作する必要があります。モックアウトすることもできますが、UIメソッドを呼び出す場合はモックアウトするのが難しくなります。

第二に、ビューモデルは何が表示されるかを気にする必要はありません。これらを組み合わせ始めると、本当の「関心の分離」の問題が発生します。

第三に、それはただ「コードの臭い」を持っています。

この問題を回避するためにできることがいくつかあります。私が最初に提案するのは、ダイアログを使用しないことです。ダイアログにはその場所がありますが、プログラマーはそれらを使いすぎる傾向があります。デザインを再考し、ユーザーの邪魔をせずに仕事を成し遂げる方法を見つけてください。

次に、メッセージングフレームワークを使用して、ビューモデルとビューの間でメッセージを送信し、ダイアログへのナビゲーションを行うことを検討してください(どうしても使用する必要ある場合)。メッセージは非常に簡単にモックアウトしたり、単体テストを記述したりできます。

于 2012-05-24T19:30:55.367 に答える
1

これを行う簡単な方法:dialogserviceを使用します-使いやすく、単体テストも簡単です!

これを参照してください。

于 2012-05-25T06:37:52.917 に答える
0

ViewModelsの相互通信に問題はありません。問題は、システムのテスト容易性に影響を与えるため、ビューまたは他のダイアログへのアクセスを開始するかどうかです。

より緩く結合されたシステムが本当に必要な場合は、通信に何らかのメッセージングシステムを使用できますが、ここでそれが必要になるとは思えません:-)

于 2012-05-24T19:29:02.137 に答える
0

私はこれを行うために常にSeelctorサービス(単なる基本的なダイアログサービス)を使用します-それはテスト可能でモック可能であり、コードを非常に堅実に保ちます。

class ViewModel
{
    public ICommand ShowListSelectorForCounterparties { get; set; }

    public IListSelectorService ListSelector { get; set; }

    public void OnExecuteShowCounterpartySelector()
    {
        this.Counterparty = this.ListSelector.Select<Counterparty>();
    }
}

ここで、IListSelectorServiceは、実行時にダイアログをインスタンス化し、リストを表示して、選択したアイテムを返すことができます。この方法で実行することの主な利点は、単体テストでIListSelectorServiceをモックできることです。

于 2012-05-25T09:19:19.253 に答える
0

あなたがまだ助けを探しているかどうかはわかりませんが、ダイアログに関して私が取ったアプローチは、ビューが処理できるイベントをビューモデルに発生させることです。これで、ビューはデータをビューモデルに取得するために必要なことをすべて実行できるため、ビュー内のダイアログを問題なく表示できます。ダイアログからの応答をイベントのEventArgsに渡して、続行するためにビューモデルが探しているデータを取得できるようにします。

例えば:

Public Class View

   Private WithEvents _VM AS new ViewModel()

   Private Sub _VM_AddingItem(Sender AS Object, E AS ViewModel.ItemEventArgs)
      Dim Dialog As new SomeDialog()

      If Dialog.ShowDialog then 
         E.Item = Dialog.Item
      Else
         E.Cancel = True
      End If
   End Sub 

End Class


Public Class ViewModel 
   Public Sub AddItem(Item AS Object) 
       Do Some Work here 
    End Sub 

    Private Sub _AddItem() 
       Dim Args AS New ItemEventArgs()

       OnAddingItem(Args)

       If not Args.Cancel Then AddItem(Args.Item)
    End Sub 

    Protected Sub OnAddingItem() 
       RaiseEvent AddingItem(me, ItemEventArgs)
    End Sub

    Public Event AddingItem(Sender AS Object, E As ItemEventArgs)

    Public Class ItemEventArgs
       Public Property Item AS Object
       Public Property Cancel AS Boolean = false
    End Class
End Class

次に、コマンドをプライベート_AddItemメソッドに接続するだけで、イベントが発生してAddItemメソッドに必要なデータが収集されます。これがお役に立てば幸いです:)

于 2012-08-10T13:03:40.607 に答える