2009-08-04 6 views
4

Ich brauche alle Kinder einer Ansicht, um ein Stück kontextuelle Informationen zu kennen (die Person, die sie zeigen müssen). Ich brauche auch den Ansatz, um mit MVVM kompatibel zu sein. Ich habe das mit RegionContext in meiner Prism-Anwendung versucht. Hier ist mein Ansatz und Probleme:Share Kontextdaten mit allen Kindern einer Kontrolle

Ich habe ein TabControl, die ich anzeigen Injection verwenden, um mit Blick auf bevölkern, so dass ich RegionContext füllen kann:

Von Shell.xaml:

<TabControl DockPanel.Dock="Right" cal:RegionManager.RegionName="TabRegion"> 

Und hier sind meine Injektion

//Create an instance of ContactView.xaml 
contactView = CreateContactView(contact); 
_regionManager.Regions["TabRegion"].Add(contactView, contactKey, true); 

//"contact" being a simple entity of type Contact 
RegionManager.SetRegionContext(contactViewb, contact); 

Was ich erwartete war in der Lage sein, eine angefügte Eigenschaft zu verwenden, um den Wert des R zu erhalten egionContext von jeder Kontrolle, die ein Kind dieses DependencyObject ist (ContactView.xaml) über die RegionManager.RegionContext angebracht Eigenschaft:

Von ContactView.xaml

<TextBlock Text="{Binding 
    RelativeSource={RelativeSource Self}, 
    Path=(cal:RegionManager.RegionContext)}"/> 

Aber das funktioniert nicht ... Ich habe ContactView.xaml zu finden, um es zu arbeiten:

<TextBlock Text="{Binding 
    RelativeSource={RelativeSource 
      Mode=FindAncestor, 
      AncestorType={x:Type views:ContactView}}, 
    Path=(cal:RegionManager.RegionContext)}"/> 

Das ist in Ordnung, aber ich werde Module erlauben Einblicke in Contact zu laden, und ich würde es vorziehen, sie hatten nichts wissen Contact.

Ich denke, meine Frage ist wirklich, Wie wird erwartet, dass Sie eine komplizierte Ansicht mit vielen Steuerelementen und Regionen laden und sie alle ein Stück Kontextdaten teilen?

Was ist der richtige Weg? Scoped Behälter? Schreiben Sie eine neue angefügte Eigenschaft, die die Steuerhierarchie hochfährt, um den RegionContext (ugh) zu finden? Ich verwende RegionContext nicht korrekt? Ich bin für alles offen. Schlage weg.

Antwort

3

Ein besseres Design vermeidet die Verwendung von RegionContext insgesamt. Das ist eine Art der Injektion von Depressionen für Arme, da sie nur ein Objekt aufnehmen kann. Wenn Sie einen Unity-Container mit einem Bereich verwenden, in den Sie den Kontakt injizieren, führt dies zu einer besseren Testbarkeit des ViewModels und vermeidet den unvermeidlichen Konflikt, wenn zwei Elemente in RegionContext benötigt werden.

+0

Ja ... Ich verstehe deinen Standpunkt. Ich befürchte, dass der Container zu einem Abladeplatz für Daten werden wird, aber wahrscheinlich der beste Ort für "Umgebungsdaten". –

+0

Auch ... wofür ist RegionContext gut? Der "Kontext" Teil des Namens scheint irreführend. –

+0

Können Sie einen Link zum Beispiel eines "scoped Unity container" im Prisma geben? Ich kann es nicht in Google finden. –

Verwandte Themen