0

Caliburn Micro を使用して、アプリケーション用の Visual Studio スタイル インターフェイスを作成しています。

アプリケーションの下部にドッキングされている「エラー」ビューにすべて表示される複数のウィンドウで複数のエラーが発生する可能性があります。ドキュメントに変更が加えられると、VM にエラーが通知され、ソース オブジェクトにクエリを実行できるように、適切な通知メカニズムを実装することができました。

ただし、ダブルクリックしてエラーの原因に移動する方法を理解するのに問題があります。

ドキュメント ビューのテキスト ボックスに「説明」をバインドすると、「説明が必要です」という検証メッセージが表示されるとします。メッセージをダブルクリックすると、ユーザーは問題のドキュメントに移動し、テキスト ボックスにフォーカスする必要があります。

IViewAwareメッセージを提供する検証オブジェクトには、(インターフェイスとして) ビューモデルへの参照が既に含まれています。これによりGetView()、ビューへの参照を取得するために呼び出すことができます。このアプローチを使用して、ビューのバインディングを列挙し、特定のプロパティにバインドされているコントロールを見つけようとしましたが、これは非常に遅く、力ずくのようなものです-運が良ければアプローチ

この問題へのアプローチに関する推奨事項はありますか? 私の他の唯一の考えは、「フォーカス」アクションの責任をビュー自体に渡し、特定のプロパティへのナビゲーションの要求を処理する方法を決定することです。おそらく、添付プロパティを使用して、一意のプロパティ識別子によって特定のコントロールを識別します。アプリケーションは、このリストをディクショナリにキャッシュして、処理を高速化できます (すべての処理は、アプリの読み込み時に事前に実行されます)。

正しい場所にジャンプするには行番号が必要なだけなので、Visual Studio は標準のコード エディター ウィンドウに対してこれを非常に簡単に実装すると思います。

4

1 に答える 1

0

わかりましたので、これをいじって数時間後、問題なく動作するように見える解決策にたどり着きました。ビューのナビゲートを可能にするインターフェイス クラスを実装しました。

基本的なセットアップは次のとおりです。

ErrorsViewModel- ビジネス オブジェクトでエラーの再クエリが必要であるという通知を受け取り、エラーのリストを管理し、いつクエリを実行する必要があるかを管理します (UI のロックを防ぐためにバックグラウンド スレッドで作業を実行できるようにするため)。

WorkspaceViewModel- ツール ペインとドキュメントをホストするメイン ワークスペース VM

ICanNavigate- ナビゲーション引数の処理方法を決定するためにビューが実装するインターフェース

NavigationEventMessage- ナビゲーション通知と引数を提供するためにイベント アグリゲーターに送信されるメッセージ

ErrorsViewModel、イベント アグリゲータを介して別の VM からイベント メッセージを受信し、最終的にオブジェクトを照会します (可能な場合)。エラーが収集されると、ビューに項目が表示されます (現時点ではグリッド コントロール内)。

ユーザーが行をダブルクリックするNavigationEventMessageと、それをディスパッチしたビューやターゲット ビジネス オブジェクトなどの引数を含む行がディスパッチされます。

1) WorkspaceViewModels ビュー。これにより、各オブジェクトの DataContext を確認し、メッセージで渡されたビューと一致するかどうかを確認することで、正しいドキュメントをアクティブ化できます。

2) ターゲット ドキュメント ビュー。ビューは、メッセージで送信された引数に基づいて、何を強調表示/表示/シークするかを決定します。

ViewModel はまだビューと結合していないため、これは VM をビューから分離する最も論理的な方法のように思われました。ビューはインターフェイスを実装するだけで、VM はそれが存在する場合はそれを呼び出し、引数に渡します。

于 2012-11-27T09:16:39.580 に答える