2016-10-07 3 views
3

Ehrlich, ich weiß nicht, wie ich das fragen soll. Lassen Sie mich zuerst mein Szenario erklären.Wie verwende ich dynamischen DataType in C#?

Vom answer, die ich von meiner letzten Frage bekommen haben:

... 
var frame = sender as Frame; 
UserControl1 uc1 = frame.Content as UserControl1; 
MainViewModel mvm = uc1.DataContext as MainViewModel; 
... 

Wie Sie frame.Content Änderungen sehen können und es können verschiedene Datentyp haben. Daher kann ich nicht einfach UserControl1 schreiben. Nun, was kann ich als Ersatz für UserControl1 schreiben?

Update: Added Details

  • frame.Content verändert sich auf Interaktion mit dem Benutzer
  • ich den aktuellen Datentyp des DataContext von frame.Content während der Laufzeit

Wie immer bestimmen möchten, informieren Sie bitte Ich, wenn Sie eine Klarstellung wünschen.

+0

Sie können keine Kompilierungszeitsicherheit haben, wenn Sie nicht wissen, was der _actual_-Typ (oder ein Subtyp) zur Kompilierungszeit ist. Wenn Sie eine kleine Anzahl möglicher Typen haben, die _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ~ ~ ~ ~ ~ ~ ~ | –

+0

@DStanley Ja, da ich jetzt eine kleine Anzahl von möglichen Typen habe, könnte es sein, aber es ist ein laufendes Projekt, so dass die Anzahl der möglichen Typen zunehmen wird, wenn wir das ganze Projekt beenden. Muss ich den Typ manuell überprüfen? Es wird dann eine lange Reihe von if-Aussagen geben. – someone

+0

@DStanley Eine andere Frage, wie wäre es, wenn alle 'DataContext' ein Feld mit dem Namen _title_ haben und es das einzige ist, auf das ich zugreifen möchte, ist es möglich, eine lange Reihe von if-Anweisungen zu vermeiden? – someone

Antwort

2

Wenn das einzige, was Sie aus frame.Content brauchen ein DataContext ist, können Sie versuchen, es zu FrameworkElement Gießen, zB:

var frame = sender as Frame; 
FrameworkElement content = frame.Content as FrameworkElement; 
MainViewModel mvm = content.DataContext as MainViewModel; 

Wenn frame.Content nicht immer ein FrameworkElement Ihnen mit, dass zunächst überprüfen möchten:

var frame = sender as Frame; 
FrameworkElement content = frame.Content as FrameworkElement; 
if (content != null) { 
    MainViewModel mvm = content.DataContext as MainViewModel; 
    // work with mvm... 
} 
else { 
    // Frame's content is something unexpected. 
} 
+0

Entschuldigung für späte Antwort. Ja, was ich aus 'frame.Content' brauche, ist der' DataContext', aber 'frame.Content' ändert sich und hat seinen eigenen' DataContext'. Was kann ich als Ersatz für 'MainViewModel' in Ihrem Beispiel schreiben? Ich möchte auch den DataType (oder ObjectType) des aktuellen DataContext zur Laufzeit ermitteln. – someone

+0

Verwenden Sie die Methode 'obj.GetType()', um den Typ eines Laufzeitobjekts zu bestimmen, und ein C# -Operator überprüft, ob ein Objekt einen bestimmten Typ aufweist. Wenn Sie nur das Hauptfenster herausfinden und seinen 'DataContext' abrufen müssen, verwenden Sie' Application.Current.MainWindow' und/oder 'LogicalTreeHelper.FindLogicalNode', um ein Objekt mit dem benötigten View-Modell zu finden. –

Verwandte Themen