4

私のMVVMCアプリケーションには、複数のステップを含むプロセスがあります。基本的にはウィザードです。

私のコントローラーは私の外側のビューを解決し(それを呼び出しますWizardView)、それをメイン領域に追加します。

WizardViewウィザードの進行状況を示すブレッドクラムトレイルと、他のビューをロードするサブリージョンが含まれています(これを呼び出しますWizardRegion)。Step1Viewにロードされた最初のビューWizardRegionです。

各ビューには、Unityコンテナーを使用してコンストラクターに注入されたViewModelがあります。

WizardViewModelステップビューモデルによって公開されるいくつかのイベント集約イベントをサブスクライブします。

各ステップが完了すると、ビューモデルWizardViewModelは状態の保存に使用するイベントを公開します。これは、WizardViewModel進行中に各ステップからデータを収集することを意味します。ステップViewModelは、コントローラーを呼び出して次のステップをにロードしWizardRegionます。

最後のステップWizardViewModelで、ウィザードの結果が保存され、MainRegionは他の画面に戻ります。

次にウィザードに入るときに、すべてのビューとViewModelの新しいインスタンスを作成しますが、前のウィザードのイベントサブスクリプションは引き続き存在します。

ビューモデルが非アクティブ化されていることを認識させて、イベントの購読を解除するにはどうすればよいですか?

もう1つのオプションは、イベントハンドラーでイベントのサブスクライブを解除することです。これはおそらく機能しますが、ウィザードに戻ってイベントを再度サブスクライブする必要がある場合は、複雑さが増します。

4

2 に答える 2

6

Microsoft.Practices.Prism.IActiveAware解決策は、ビューモデルに実装することです。

public bool IsActive
{
    get { return _isActive; }
    set
    {
        if (_isActive != value)
        {
            _isActive = value;
            DoActiveChangedWork(value);
        }
    }
}

public event EventHandler IsActiveChanged;

ビューでこれを実装することも可能ですが、必須ではありません。

于 2013-02-19T14:12:30.513 に答える
0

Prism EventAggregatorについて話している場合は、keepSubscriberReferenceAliveパラメーターをに設定して、内部falseで弱参照を使用するようにすることができます。これにより、オブジェクトが「死ぬ」ときに、GCによってすべてが自動的に「サブスクライブ解除」されます。

fundAddedEvent.Subscribe(FundAddedEventHandler, ThreadOption.UIThread, true);

それ以外の場合は、明示的に購読を解除して自分で行う必要があります。

fundAddedEvent.Unsubscribe(FundAddedEventHandler);
于 2013-02-15T12:38:37.123 に答える