/ / So erstellen Sie eine neue Instanz einer Ansicht / eines Ansichtsmodells, wenn die Navigation mit Prism erfolgt - silverlight-4.0, prism, prism-4

So erstellen Sie eine neue Instanz einer Ansicht / eines Ansichtsmodells, wenn die Navigation mit Prism erfolgt - Silverlight-4.0, Prism, Prism-4

Ich versuche zu steuern, wann eine neue Ansicht erstellt und wann eine vorhandene Ansicht angezeigt wird.

Dies ist ein sehr ähnliches Szenario, wie im Abschnitt "Navigieren zu vorhandenen Ansichten" in der Prism-Dokumentation beschrieben, aber ich kann es nicht vollständig zum Laufen bringen: http://msdn.microsoft.com/en-us/library/gg430861(v=pandp.40).aspx

Ich stelle fest, dass ich die Ansicht / das Ansichtsmodell zunächst in Ordnung erstellen kann, dann aber keine neue Instanz davon erstellen kann. Das heißt Ich möchte, dass mehrere Instanzen gleichzeitig existieren.

Hier ist ein Beispiel für das Ansichtsmodell:

[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; }
}
}

Ich navigiere dazu wie folgt:

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

Beim ersten Aufruf oben wird die Ansicht angezeigt.

Beim nächsten Aufruf von RequestNavigate rufe ich dieIsNavigationTarget wird getroffen und gibt false zurück. Ich möchte dann, dass es eine neue Instanz erstellt, aber das passiert nicht. Ich weiß, dass es nicht passiert, weil der Konstruktor nicht getroffen wird und die Benutzeroberfläche nicht aktualisiert wird, um die neue Instanz der Ansicht anzuzeigen.

Irgendwelche Ideen, wie ich eine neue Instanz erstellen kann?

Danke vielmals,

Paul

Bearbeiten

Mir ist aufgefallen, dass ich das zweite Mal anrufeRequestNavigate (um eine andere Instanz derselben Ansicht anzufordern) Der Rückruf meldet den Fehler "Ansicht existiert bereits in der Region". Es scheint daher, dass ich mehrere Instanzen unterschiedlicher Ansichten in einer Region haben kann, aber nicht mehrere Instanzen derselben Ansicht. Ich verstehe das nicht so gut, also könnte ich mich irren.

Antworten:

0 für die Antwort № 1

Warum erstellen Sie die Ansicht nicht, wenn eine neue erstellt werden soll? Mir scheint, Sie verwenden MEF.

  1. Verwenden Sie den Container, um eine neue Instanz Ihrer Ansicht aufzulösen
  2. Fügen Sie der MainRegion die neue Instanz der Ansicht hinzu
  3. Rufen Sie dann Navigate auf und behandeln Sie die entsprechende Logik in IsNavigationTarget

0 für die Antwort № 2

Du solltest das benutzen [Export] Attribut aus Ihrer Sicht mit einem Vertragsnamen: [Export("DataEntryPageView")].


0 für die Antwort № 3

Ich konnte das jetzt zum Laufen bringen, weil ich es nicht hatte

[PartCreationPolicy(CreationPolicy.NonShared)]

auf der Klassendeklaration der Ansicht. Ich hatte es auf dem ViewModel.

Das führt nun zu dem Verhalten, das ich erwartet habe.

Vielen Dank an Zabavsky und Alan für Ihre Vorschläge.