2011-07-26 8 views
0

내 아이 창을 닫을 때 언로드되도록하려면 어떻게해야합니까?닫을 때 childwindow 언로드

내 viewmodel에서 childwindow를 여는 중이지만 닫힌 후에도 combobox에서 selectionchanged와 같은 이벤트가 계속 발생합니다.

childwindow는 호출 된 것과 동일한 viewmodel을 사용하고 있으므로 이벤트가 시작되는 이유를 추측 할 수 있습니다. 아이템 소스는 여전히 유효합니다.

하지만 닫히면 아이 윈도우를 "처분"하고 싶습니다.

그래서 내가 지금하고 있어요에서 itemssource을 제거하는 것입니다 ..

private void OnLaunchEditItem(ItemMessage msg) 
    { 
     var editWnd = new EditItemWindow(); 
     editWnd.Closed += new EventHandler(editWnd_Closed); 
     editWnd.Show(); 
    } 

    void editWnd_Closed(object sender, EventArgs e) 
    { 
     sender = null; 
    } 

없음 sucesss :

나는 (뒤에 기본보기 코드)이 같은 폐쇄 형 처리기를 추가하려고했습니다 childwindow 컨트롤, 나에게 보인다 ... 문제에 대한 이상적인 해결책이 아닙니다. 닫을 때 메모리에서 모두 처분 할 수 있어야합니까? (Childwindow "보기"코드 숨김) 뷰 사이

private void OKButton_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = true; 
     combobox1.ItemsSource = null; 
     combobox2.ItemsSource = null; 
    } 

    private void CancelButton_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = false; 
     combobox1.ItemsSource = null; 
     combobox2.ItemsSource = null; 
    } 
+0

http://stackoverflow.com/questions/7036873/when-to-dispose-viewmodel-in-mvvm-light – Kman

답변

1

메시지에는 메신저와 메시지받는 사람 사이에 하드 링크가 도입되는 것으로 알려진 문제점이 있습니다. 따라서 메시지를 사용하는 경우 Messenger.Unregister 메쏘드가 호출되도록해야합니다. 즉, Register으로 전화를 걸어 메시지를 처리 ​​할 경우 Unregister으로 전화하십시오.

그래서보기에서 Unloaded 이벤트에 등록해야합니다. 거기서 당신은 Messenger.Unregiser(this);이라고 전화합니다.

ViewModels에서 Cleanup 메서드가 호출되어 ViewModel을 메시지받는 사람으로 등록 취소했는지 확인해야합니다.

또한 참조 :

MVVM Light Listener not releasing/deterministic finalization for registered object?MVVM Light Messenger executing multiple times을.

로랑은이 문제를 알고 있지만 현재로서는 해결책이 없습니다.

0
  1. 공유 ViewModels이 같은 문제가 발생할 수 있습니다. 그것이 거의 이루어지지 않는 이유입니다.
  2. ViewModel은 일반적으로 탐색과 관련이 없어야합니다. 이는 이상적인 세계에서 어떤 유형의보기가 바인딩되어 있는지 알지 못하기 때문입니다. 여기에는 하위 뷰 생성 (ChildWindows)이 포함됩니다.

두 가지 변경을 권합니다. 첫 번째는 대화 상자에 대한 전용 뷰 모델을 만드는 것입니다. 두 번째는 탐색기를 컨트롤러에 위임하여 뷰 모델에서 탐색을 분리하는 것입니다. MVVM의 컨트롤러는 일반적으로 윈도우, 대화 상자 등을 여는 단일 목적의 개체입니다.이 작업은 이벤트 수집기 패턴을 사용하여 매우 우아하게 구현할 수 있습니다.

+0

viewmodel은 가져온 mvvmlight 메시지를 전송할 때 자식 창을 "인식하지 못합니다" 기본보기로 위의 코드는 자식 창을 여는 것에서 가져온 것입니다. 위의 코드는 모두 viewmodel이 아닌 view 코드 숨김의 코드입니다.그러나 기본보기와 하위 창 "보기"는 동일한보기 모델에 연결되어 "selecteditem"을 공유합니다. – Kman

+0

Oliver Weichhold : 경험상 ... 이와 같은 동작은 일반적으로 메시징이 잘못되었음을 나타냅니다. 즉, 메시지 처리기의 등록 취소가 없음을 나타냅니다. 이것은 MVVM-Light의 ** ** 알려진 동작입니다. Oliver Weichhold와 @Kman이 내 대답을 봅니다. – AxelEckenberger

관련 문제