2016-08-01 57 views
1

In meiner WPF-Anwendung muss ich etwas mit meinem MainWindow auf dem ViewModel senden. So war meine Idee this.DataContext = new ViewModel (this) in Code-behind zu setzen, und dann im Konstruktor des View-Modell könnte ich benutzen Sie einfach die ‚this‘ Parameter, die ich als die Window-Instanz geschickt hatte:Übergeben der MainWindow-Instanz an ViewModel

public ViewModel(Window Wndw){/../} 

Nun, was ich tun müssen, ist ein ‚Maingrid‘ Element zuzugreifen, die in meinem Fenster ist:

<Window bunch 
     of 
     stuff> 
    <Grid x:Name="MainGrid"> 
    </Grid> 
</Window> 

aber wenn ich versuche, so etwas wie:

Grid MGrid = Wndw.FindName("MainGrid") as Grid 

ich erhalte keine Fehler, aber es ist immer null, also ich ke ep bekommt Null Reference Exception, wenn ich versuche, irgendetwas mit MGrid zu tun. Die Wndw ist nicht Null, ich habe das getestet. Und es ist auch keine Option, MainGrid anstelle des gesamten Fensters zu übergeben.

Irgendwelche Ideen?

+0

Tu das nicht. Übergeben Sie dieses Fenster niemals, um das Modell anzuzeigen. Dann ist es nicht sinnvoll, dem MVVM-Muster zu folgen. – ViVi

+0

Ich folge nicht strikt dem MVVM-Muster –

+0

Dann schreiben Sie den Code einfach in Window.xaml.cs als übergeben Sie es an Viewmodel. Dies scheint eine nutzlose Übung zu sein. Mit MVVM können Sie auf das Fenster im Ansichtsmodell zugreifen. Fügen Sie es nicht ein, um den Modellkonstruktor so anzuzeigen. – ViVi

Antwort

1

Warum die FindName-Methode verwenden? Sie können dies tun:

Grid MGrid = Wndw.MainGrid; 

Und statt das Fenster Ihrer Ansicht nach Modell params geben, könnten Sie dies tun:

// if the window you want is your main window 
CustomWindow the_window = (CustomWindow)App.Current.MainWindow; 

// if it's a secondary window 
CustomWindow the_window = (CustomWindow)Window.GetWindow(your_view_model_object); 
// for this, you have to check if the control is already loaded. 
+0

Was ist "App" in Ihrem Kontext? –

+0

Ihr Fenster hat keine Definition von MainGrid, weil Sie es in die Window-Klasse umwandeln. Wenn Ihre Fensterklasse CustomWindow ist, müssen Sie die richtige Umwandlung beibehalten: public ViewModel (CustomWindow Wndw) {/../} – KANAX

+0

App ist die Standardklasse für Anwendungen in Ihrem Projekt. Es ist diese Klasse, die Ihr Hauptfenster erstellt. – KANAX