2

これは、MVVM パターンのベスト プラクティスに関する具体的な質問です。MvvmLight ライブラリを使用しています。私のモデル、たとえば「フライト」は、メソッドを介してフライトを開始、一時停止、および停止できるいくつかのビジネス ロジックを実装しています。各メソッドは、フライトを停止するか一時停止するかに関係なく、機能を実現するロジックを実行します。変化する重要な変数の 1 つは、フライトのステータス (再生中、停止中、一時停止中) を示すステータス列挙型です。前述のように、ステータス変数 (およびプロパティ) はモデルで定義されます。一方、フライト クラスは、ステータス変数をフライト モデルにラップする Status プロパティを含む ViewModel クラスと、フライト モデルの play stop 一時停止メソッドに接続する RelayCommands によってラップされます。

ここで問題が始まります。ビューを介してコマンドの 1 つを実行すると、モデル内でメソッドが実行されるため、ステータス変数自体が直接変更されますが、モデル内でのみ変更されます。ViewModel のステータス プロパティは変更されません。直接変更されたため、ラップされた変数が変更されたかどうかを知る...つまり、ビュー要素がステータスプロパティにバインドされている場合、コマンドの実行時に変更されません..

これを解決する方法はいくつか知っていますが、MVVM パターンを壊さない公正な解決策を求めています ( Model のフライト クラスで INotifyPropertyChanged を使用するなど)。

4

5 に答える 5

5

この種の問題に対する特効薬の解決策はありません。ViewModel と Model は、情報が View に伝播できるように設計する必要があります。これが不可能な場合は、設計に欠陥があり、変更する必要があります。

ここでは、いくつかの点を確認する必要があります。

  • モデルの状態変更メソッドが同期的に実行されるように文書化されている場合は、アクションをモデルに転送し、すぐにその状態を照会するメソッドを ViewModel に作成します。の実装には、これらのメソッドを使用しますRelayCommand
  • モデルのメソッドが同期的でない場合、メソッドが完了したときにモデルのクライアントに通知するために、モデルのクライアントが利用できる何らかのメカニズムが必要です。これは、継続コールバック、イベント、またはINotifyPropertyChanged.
于 2012-11-27T09:50:58.210 に答える
4

上で述べたように、ViewModel は次の方法で Model をラップする必要があります。

class Model
{
   public int State{get;private set;}
   public void Fly()
   {
      State=1;
   }

   public void Stop()
   {
      State = 2;
   }
}

class ViewModel : ViewModelBase
{
   int State{ get{ Model.State;}}
   ...
   OnFlyCommand()
   {
      Model.Fly();
      NotifyPropertyChanged("State");
   }
}
于 2012-11-27T09:55:58.027 に答える
3

ViewModel が Model でメソッドを実行した直後に OnNotifyPropertyChanged を呼び出すことができます。これはあまりエレガントではありませんが、Model クラスをリファクタリングせずにこれ以上単純にすることはできません。

于 2012-11-27T09:54:30.273 に答える
1

コマンドの実行後にどのプロパティが変更されたか知っていますか? つまり、特定のプロパティのセットまたは変更されたプロパティのセットが変更されている場合に、変更通知を明示的に発行できますか?

前者の場合、コマンドを呼び出して、それらのプロパティのイベントを明示的に発生させます。

command.Execute();
NotifyPropertyChanged("PropA");
...
NotifyPropertyChanged("PropN");

Model2 番目のケースでは、リフレクションを使用してクラスのすべてのプロパティに対して変更通知イベントを発生させるか、PostSharp.Domain.Toolkitのようなよりスマートなソリューションを使用できます。

于 2012-11-27T09:57:05.760 に答える
1

ベスト プラクティスは、viewmodel からモデルの変更を呼び出すよりも、コマンド実行から viewmodel を呼び出すことです。その後、viewmodel の状態を変更済みとしてマークします。

于 2012-11-27T09:49:45.527 に答える