2011-11-10 67 views
1

我有一個包含TabControl的視圖(我將其稱爲MainView)。構成TabItem的視圖是在MainView的ViewModel中使用棱鏡view discovery創建的。當我完成選項卡控制時(即在MainView的Unloaded事件期間),「選項卡」的每個視圖都需要完成一些清理(分離事件處理程序等)。但是,我無法使用Tab視圖'Unloaded事件進行清理,因爲這僅在切換選項卡時纔會調用。當父視圖被卸載時,如何清理TabControl中的視圖?

當觸發Unloaded時,MainView在其ViewModel上調用方法,但由於這些視圖的註冊方式,ViewModel沒有對構成選項卡的Views或ViewModel的引用。在「發現」選項卡視圖後清理的正確方法是什麼?

回答

1

我們最終通過EventAggregator使用消息來清理子視圖。

1

我有類似的情況,但我們正在使用Prism來加載視圖的Dock控件。因此,在卸載事件背後的Shell Views代碼中,我們循環打開Views並獲取每個視圖的ViewModel。我們所有的ViewModel繼承自一個基本的ViewModel,它有一個虛擬的bool CanClose方法,返回視圖是否可以關閉。基礎ViewModel只返回true。此方法用於檢查是否存在驗證錯誤,未保存的更改等。因此,您可以重寫此方法並執行清理操作。如果所有視圖都返回true,那麼您可以調用主外殼viewmodel卸載,如果不是,則可以取消卸載的主視圖。

foreach (var doc in dockManager.Documents) 
{ 
    if (!doc.CanClose()) 
    { 
     e.Cancel = true; 
     return; 
    } 
} 
+0

感謝您的答覆。我最終做的是使用EventAggregator模式將消息發佈到父視圖正在關閉的子視圖,並在此時執行任何清理。雖然你的解決方案看起來更優雅。 –

+0

我們實際上有一個使用EventAggregator的ApplicationClosing事件,所以任何後臺進程都可以準備關閉。我認爲這也是很好的解決方案,只是不使用它來關閉打開的視圖。 – Brad

0

我在我的應用程序中使用Prism導航,並面臨同樣的問題。 爲了解決這個問題,在父視圖模型,在OnNavigatedFrom方法,我關閉在的TabControl的區域中的所有觀點:

public class ParentViewModel : INavigationAware 
{ 
    ... 
    public void OnNavigatedFrom(NavigationContext navigationContext) 
      { 
     var region = RegionManager.Regions["TabsRegion"]; 
     foreach (var view in region.Views) 
      region.Remove(view); 
    } 
} 
相關問題