2016-08-01 5 views
1

내 WPF 애플리케이션에서 ViewModel의 MainWindow를 사용하여 뭔가를 보내야합니다. 그래서 내 생각은보기 모델의 생성자 난 그냥 윈도우 인스턴스로 전송했던 '이'매개 변수에 사용할 수있는 코드 숨김 다음에 this.DataContext = new ViewModel (this)을 설정했다 : 이제MainWindow 인스턴스를 ViewModel에 전달

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

를 내가

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

하지만이 같은 것을 할 때 :해야 할 것은 내 창 안에있는 'MainGrid'요소에 액세스입니다

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

을 내가 오류를 얻을하지 않습니다를하지만 항상 null의 경우, 그래서 나는 내가 MGrid를 가지고 무엇인가하려고 할 때, Ep는 널 참조 예외를 얻는다.

반면에 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