13

MvvmCross v3 ではShowViewModel、さまざまなページに移動するために使用します。Mvx に変換する前に、NavigationService.GoBack()メソッドを使用して前のページに戻ります。ページが再作成されないという利点があります。

このGoBackメソッドは WP、WInRT、Silverlight に固有のプラットフォームであるため、ビュー モデルがプラットフォームに依存しないように前のページに戻るのを処理する最良の方法は何ですか?

解決策の 1 つShowViewModelは、ビューが表示できるデータを渡してから、WP/WinRT の場合はRemoveBackEntryビューから呼び出すことです。しかし、Mvx の場合は、おそらくもっと良い方法があります。

4

2 に答える 2

18

MvvmCross v3 では、ViewModel が現在のプレゼンテーションを変更したいというメッセージを UI に送信できるようにする特定のメカニズムを提供しました。

このメカニズムは、 からへChangePresentation(MvxPresentationHint hint)のメッセージ (プレゼンテーション ヒント) のルーティングを提供します。ViewModelsPresenter

がこれらのメッセージを処理する方法は、Presenterプラットフォームおよびアプリケーションによって異なります。

このメッセージ メカニズムは非常に一般的であり、将来あらゆる種類のものに使用される可能性があります。たとえば、開発者は、UI レイアウトの変更、UI の一部の強調表示、ユーザーのフォーカスを特定のものに強制するなどのヒントを提供する可能性があります。 SIP を表示または非表示にするなどの制御。


ビュー モデルを閉じる場合のために、特殊化されたMvxPresentationHint- MvxClosePresentationHint- とヘルパー メソッドが の基本クラスに用意されていMvxViewModelます。

    protected bool Close(IMvxViewModel viewModel)
    {
        return ChangePresentation(new MvxClosePresentationHint(viewModel));
    }

これを使用するには、ViewModel を呼び出すだけですClose(this)

これが呼び出されると、UI 内のプレゼンターはChangePresentationメソッドでメッセージを受け取ります。

public interface IMvxViewPresenter
{
    void Show(MvxViewModelRequest request);
    void ChangePresentation(MvxPresentationHint hint);
}

一般的/典型的なケース -ViewModel閉じられている が最上位のビューにアタッチされているActivity/ Page/UIViewController場合、MvvmCross 内のデフォルトのプレゼンターはこのメッセージを処理できGoBack、Windows、FinishAndroid、およびPopViewControlleriOSに。

ただし、UI がそれよりも複雑な場合 (たとえば、が 、、ペインなどViewModelClose実際に対応する場合、またはが階層内の現在の最上位ビュー以外のものに対応する場合) は、カスタム プレゼンターの実装を提供する必要があります。また、その実装は、プラットフォームおよびアプリケーション固有のロジックを実行して.TabFlyoutSplitViewViewModelClose


上記のヒントは、私があなたに使用することをお勧めするものです...

ただし、代替手段として

このChangePresentation(MvxPresentationHint hint)メカニズムが単にアプリにとって重すぎる/やり過ぎだと感じた場合は、もちろん、Message代わりにカスタムまたはベースのメカニズムにドロップダウンすることもできます。

これを行う 1 つのサンプルは CustomerManagement サンプルです。各プラットフォームでカスタム IViewModelCloser 実装を提供します。次を参照してください。

于 2013-04-23T00:30:27.260 に答える
3

mvvmcross については完全にはわかりませんが、MVVM Light では通常、これらのメソッドを公開する INavigationService インターフェイスを作成します。

次に、各プラットフォームは、プラットフォーム固有の方法でこのインターフェイスを実装します (たとえば、WP では、現在のフレームとそのコンテンツへの参照を取得することによって)。このプラットフォーム固有のインスタンスは、ナビゲーション パターンが正しく実装されていることを確認するために、すべての正しいアクションを実行できます。

ViewModel は、依存関係コンテナーを介して INavigationService のインスタンスへの参照を取得できます。そうすれば、VM はナビゲーションのプラットフォームの仕様に依存しません。

インターフェイスを使用してプラットフォーム固有の機能に共通の API を公開する方法についてのブログ投稿も書きました。 -phone-and-windows-8-applications/

ブログ投稿の例は分離ストレージに関するものですが、同じ原則がナビゲーション (またはさまざまなプラットフォームで異なる実装を持つ機能) に適用されます。

于 2013-04-22T22:13:29.217 に答える