1

新しいビューがいつ作成され、既存のビューがいつ表示されるかを制御しようとしています。

これは、Prismドキュメントの「既存のビューへの移動」セクションで概説されているシナリオと非常によく似ていますが、完全に機能させることはできません:http: //msdn.microsoft.com/en-us/library/gg430861 (v = pandp.40).aspx

okで始まるビュー/ビューモデルを作成できることがわかりましたが、その後、その新しいインスタンスを作成できません。つまり、一度に複数のインスタンスが存在するようにしたいのです。

ビューモデルの例を次に示します。

[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class DataEntryPageViewModel : INavigationAware, IRegionMemberLifetime
{
    private Guid id;

    [ImportingConstructor]
    public DataEntryPageViewModel()
    {
        id = Guid.NewGuid();
    }

    public bool IsNavigationTarget(NavigationContext navigationContext)
    {
        // In actual fact there would be more logic here to determine
        // whether this should be shown to the user
        return false;
    }

    public void OnNavigatedFrom(NavigationContext navigationContext)
    {
    }

    public void OnNavigatedTo(NavigationContext navigationContext)
    {
    }

    public bool KeepAlive
    {
        // For the purposes of this example we don't want the view or the viewModel
        // to be disposed of.
        get { return true; }
    }
}

私は次のようにこれにナビゲートしています:

m_RegionManager.RequestNavigate(
               "MainRegion",
               new Uri("/DataEntryPageView", UriKind.Relative));

したがって、最初に上記を呼び出すと、ビューが表示されます。

次にRequestNavigateを呼び出すと、IsNavigationTargetがヒットし、falseが返されます。次に、新しいインスタンスを作成することを望んでいますが、それは実現しません。コンストラクターがヒットせず、UIが更新されてビューの新しいインスタンスが表示されないため、これが発生していないことはわかっています。

新しいインスタンスを作成する方法はありますか?

どうもありがとう、

ポール

編集

(同じビューの別のインスタンスを要求するために)2回目にRequestNavigateを呼び出すと、コールバックが「ビューはすでにリージョンに存在します」というエラーを報告することに気付きました。したがって、リージョン内に異なるビューの複数のインスタンスを持つことはできますが、同じビューの複数のインスタンスを持つことはできないようです。私の理解はあまり良くないので、間違っている可能性があります。

4

3 に答える 3

0

[Export]コントラクト名を使用して、ビューで属性を使用する必要があります: [Export("DataEntryPageView")]

于 2012-10-17T07:48:51.763 に答える
0

私はこれを機能させることができました。それは私が持っていなかったからです

[PartCreationPolicy(CreationPolicy.NonShared)]

ビューのクラス宣言。私はViewModelでそれを持っていました。

これで、期待どおりの動作が得られました。

提案をしてくれた Zabavsky と Alan に感謝します。

于 2012-10-17T08:55:39.280 に答える
0

新しいビューを作成したいのに、なぜビューを作成しないのですか? MEFを使用しているように見えます。

  1. コンテナーを使用して、ビューの新しいインスタンスを解決します
  2. ビューの新しいインスタンスを MainRegion に追加します
  3. 次に、Navigate を呼び出し、IsNavigationTarget で適切なロジックを処理します。
于 2012-10-17T04:01:49.437 に答える