2016-08-01 10 views
1

私のWPFアプリケーションでは、ViewModelのMainWindowで何かを送信する必要があります。何私は今MainWindowインスタンスをViewModelに渡す

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

:だから私の考えでは、コードビハインドでthis.DataContext = new ViewModel (this)を設定し、その後、ビューモデルのコンストラクタで、私はちょうど私がWindowインスタンスとして送信されていた「この」パラメータを使用することができました、

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

私はすべてのエラーを得ることはありませんが、それは常にnullである:私の窓の内側にある「MainGrid」要素にアクセスで実行する必要があります。

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

しかし、私はのような何かをしようとすると、私はそうです私がMGridで何かしようとすると、EpはNull参照例外を取得します。

一方、Wndwはnullではありません、私はそれをテストしました。また、ウィンドウ全体の代わりにMainGridを渡すことはオプションではありません。

アイデア?

+0

それをしないでくださいあなたはこれを行うことができます。モデルを表示するためにそのウィンドウを決して通過しないでください。 MVVMパターンに従うことはありません。 – ViVi

+0

私はMVVMパターン –

+0

に厳密に従っていません。次に、viewmodelに渡すよりも単純にWindow.xaml.csにコードを書いてください。これは役に立たないようです。 MVVMを使用すると、ビューモデルでウィンドウにアクセスできます。このようにモデルのコンストラクタを表示するためにそれを挿入しないでください。 – ViVi

答えて

1

なぜFindNameメソッドを使用しますか?

Grid MGrid = Wndw.MainGrid; 

、代わりにあなたのビューモデルのparamsにウィンドウを与える、あなたがこれを行うことができます:

// 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

あなたの状況に「アプリ」とは何ですか? –

+0

Windowクラスにキャストしているため、MainGridの定義はありません。あなたのウィンドウクラスがCustomWindowの場合、正しいキャストを維持する必要があります:public ViewModel(CustomWindow Wndw){/../} – KANAX

+0

あなたのプロジェクトのデフォルトのアプリケーションクラスは、アプリケーションです。メインウィンドウを作成するのはこのクラスです。 – KANAX

関連する問題