5

新しいプロジェクトに WPF4 と PRISM4 を使用しています。

複数のビューを含む単一のモジュールがあります。DIはユニティで行われます。初めて ViewA から ViewB に移動すると、ViewB が作成され、そのコンストラクターが呼び出されます。しかし、2 回目、3 回目に ViewB に移動しようとすると、ViewB は作成されませんが、既存のインスタンスが再利用されます。

ナビゲーション目的でIRegionManager.RequestNavigateを使用しています。

TransientLifeTimeManagerRegisterType Unity メソッドに渡そうとしましたが、役に立ちませんでした。

移動するたびに新しいビューを作成するようにプリズムやユニティを構成する方法はありますか?

ありがとう。

4

3 に答える 3

20

これを行う正しい方法はINavigationAware、View または ViewModel のいずれかに実装することです (Prism は最初にビューをチェックし、実装されていない場合INavigationAwareは ViewModel もチェックします)。

IsNavigationTarget特に、ビューの現在のインスタンスを再利用する必要があるかどうか、またはナビゲーション要求を満たすために別のインスタンスを作成する必要があるかどうかを Prism に伝えるメソッドに関心があります。したがって、常に新しいビューを作成するには、次のようにします。

public class MyViewModel : INavigationAware {
    bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext)
    {
        return false;
    }

    void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext)
    {
    }

    void INavigationAware.OnNavigatedTo(NavigationContext navigationContext)
    {
    }
}

これらはすべて、Prism 4 ドキュメントの第 8 章で詳しく説明されています。彼らはまた、それがどのように機能するかの図を持っています。これは、どこにどのように接続できるかを正確に知ることもできるため、非常に優れています.

于 2011-03-04T12:50:46.437 に答える
16

これを行う方法は、ビューまたはビューモデルのいずれかに IRegionMemberLifetime を実装し、次のようにブール プロパティ KeepAlive で false を返すことです。

public class EmployeeDetailsViewModel : IRegionMemberLifetime
{
    public bool KeepAlive
    {
        get { return false; }
    }
}
于 2011-02-25T15:28:44.230 に答える
1

これは、領域のActiveViewsプロパティのView を内部的に探します。そこに存在しない場合は、新しいものを作成し、将来の使用のためにActiveViewsに追加します。

目的を達成するには、ビューに移動する前にActiveViewコレクションを削除またはクリアする必要があります。

例:

public static class RegionManagerExtensions
{
    public static void RequestNavigateEx(this IRegionManager regionManager, String regionName, Uri source)
    {
        if (regionManager != null)
        {
            IRegion region = regionManager.Regions[regionName];

            if (region != null)
            {
                foreach (Object view in region.ActiveViews)
                {
                    region.Remove(view);
                }

                regionManager.RequestNavigate(regionName, source);
            }
        }
    }
}
于 2011-02-25T09:50:23.477 に答える