5

私は、デザイナーが Visual Studio のインターフェイスに似たタブ付きインターフェイスを必要とする Silverlight LoB アプリに取り組んでいます (タブのドッキングにはおそらく Telerik Rad コントロールを使用します)。プロトタイプを作成したので、これまでのところインターフェイスはうまく機能していますが、MVVM プロジェクトで元に戻す/やり直し機能を実装する方法を考えるのに問題があります。

元に戻す/やり直し機能は、次のことを行う必要があります。

  1. 元に戻す/やり直しの際に、UI の状態を復元します。つまり、フォーカスや選択などを変更元のコントロール (テキスト ボックスなど) に戻します。
  2. ビューごとの取り消し/やり直しスタックを持つ

通常、コマンド パターンを使用しますが、それを MVVM に適用する方法がわかりません。

ビューとビューモデルの理想的な疎結合を得るためにコマンドとバインディングを使用しましたが、ビューモデルにはビューと状態の概念がないため、元に戻す/やり直しが非常に難しくなります。コマンドが受信されたとき、またはバインドされたプロパティが変更されたときのビュー。ユーザーが取り消し可能なアクションを実行し、後で復元するために状態を取得するたびに、どのビューがアクティブであるかを追跡するサービスが必要なようです。

MVVM で元に戻す/やり直しを実装するためのベスト プラクティスについて、コンセンサスはありますか? Daniel Vaughan が彼の Calcium プロジェクトでどのようにそれを行っているかに興味を持って見てきました。Blend は明らかに MVVM パターンを使用して作成されており、私のアプリが望んでいるように動作します。

4

2 に答える 2

2

最初に行う必要があるのは、アクションをインターフェースから完全に分離することです。これは、データに影響を与えるすべての操作を個別のアクションに変えることを意味します。これは、ビューの変更を引き起こすものはすべて、個別のアクションとして記録する必要があることも意味します。基本的に、インターフェイスの状態は、データの変更とコマンドベースのビューの変更のみを反映する必要があります(ただし、ビューの変更については、以下の最後のメモを参照してください)。

以前に使用した最も成功したUNDOシステムでは、IUndoableCommandオブジェクトのネストが許可されていました。これらの複合コマンドは、単一のユーザーアクション([元に戻す]メニューに表示されると予想される種類のアクション)にロールアップされます。

ビュー間でundoを使用することについて言及していることに注意してください...これは、マルチフォームアプリでは異常な動作のようです。通常、元に戻すは、個々のコントロール内およびドラッグドロップ操作に対してのみ行われます。例外は通常、グラフィックベースのインターフェイスです(フォームベースではありません)。元に戻すときにフォームを変更することは、MS Wordを別のドキュメントに切り替えて、元に戻すことを続けることと同じです...エンドユーザーにとっては非常に厄介です。ユーザーエクスペリエンスの担当者に、デザインのその側面を再考してもらいたいと思うかもしれません。ちょうど私の2セントの価値。

お役に立てれば。

于 2010-08-25T18:01:25.223 に答える
1

@JamesCo、

WPF アプリケーションに元に戻す/やり直しを実装し、元に戻す/やり直しコードをhttp://muf.codeplex.com/に公開しました。NuGet 経由で取得することもできます。「MUF」または「Monitored Undo Framework」を探してください。これには、Silverlight 4.0 のほか、.NET 3.5、4.0、および WP7 のサポートが含まれています。

私の WPF アプリも MVVM を使用しており、場合によっては、選択の変更などを元に戻すことができました。また、元に戻すアクションが適用されるページにユーザーが戻るように、WPF フレームに表示されたアクティブな「ページ」も追跡しました。

ライブラリは、各ステップを元に戻す/やり直すアクションをどのようにコーディングするかについて、柔軟なアプローチを採用しています。最終的には、元に戻すためのデリゲートとやり直しのためのデリゲートが必要になるだけです。これらのデリゲートに好きなことをさせることができます。ライブラリに含まれているのは、オブジェクト、プロパティの名前、古い値、および新しい値を単純に受け取るデフォルトの実装です。必要に応じて古い値または新しい値を適用するリフレクション ベースのデリゲートを構築します。

各ビューの変更を分離する限り、ライブラリを使用すると、「ドキュメント」または「コンテナ」ごとに元に戻す/やり直しアクションの個別のスタックを保持できます。関連する元に戻す/やり直しスタックを取得するには、コンテナーへの参照を渡すだけです。

最後に、ライブラリには、変更をまとめてバッチ処理するためのサポートが含まれています。これは、複数のアクションをまとめて元に戻す必要がある場合に役立ちます。

コメントや質問は、codeplex サイト (http://muf.codeplex.com/) で受け付けています。そこには、完全なドキュメントとサンプル アプリもあります。

于 2011-06-21T02:44:41.577 に答える