2013-12-16 94 views
4

我在我的第一個WPF4項目中使用MvvmLight 4.0/C#,並且仍然在學習MVVM/WPF索引,在那裏我發現很多以前的Windows窗體技能無效。是否調用MvvmLight viewmodel上的清理()取消所有消息

無論如何,我有viewmodelbaseRegister消息的視圖模型,同樣也有相同的觀點(註冊消息)的VM/VM和VM/V通信。所有關於清理的mvvmlight資源都表示我應該使用Unregister消息來避免內存泄漏。

因此,當我使用視圖完成後,我只是在視圖/窗口的unload事件中調用Messenger.Default.Unregister(this)。當我使用viewmodel完成時,我只需在我的viewmodel參考上調用viewmodelbase.Cleanup()即可,假設基本實現將執行(全部)取消註冊。

我想知道是否只需調用viewmodel上的Cleanup()就足夠了,還是必須在每個視圖模型中重寫此方法,並且明確地從每個覆蓋內調用Unregister。現在我創建/處理大部分我的視圖模型(不使用SimpleIOC/ServiceLocator),並且只關注清理中的所有消息。

我發現下面的SO標記已連接,但仍然沒有回答我的查詢,只是簡單地調用ViewModelBase.Cleanup()與取消註冊相比,通過顯式重寫派生的viewmodel中的方法。

Unregister(this) unregisters this instance from everything?

When and where to unregister messenger with mvvmlight

+1

所以我得到的結論是,如果我調用清理()對我的派生viewmodels,使ViewModelBase。清理(​​)被調用,我可以放心,我的所有實例都完全未從Messenger註冊,因此沒有任何內存泄漏的可能性。感謝所有的幫助。 –

回答

4

看看the code,它畢竟是開源的。

/// <summary> 
    /// Unregisters this instance from the Messenger class. 
    /// <para>To cleanup additional resources, override this method, clean 
    /// up and then call base.Cleanup().</para> 
    /// </summary> 
    public virtual void Cleanup() 
    { 
     MessengerInstance.Unregister(this); 
    } 

那麼什麼Cleanup方法實際上它很清楚。而如果你希望其他的清理:

清理額外的資源,覆蓋此方法,清理,然後調用base.Cleanup()

+0

是什麼文件,我看着ICleanup.cs和Viewmodelbase.cs,我找不到Cleanup Void本身。只是界面。 –

0

不,清理將不會自動註銷。你將不得不重寫每個視圖模型中的方法並調用Messenger.Default.Unregister(this)。這將從註冊的所有事件中取消註冊視圖模型。

我錯了。謝謝ken2k。我在網上發現了一些其他帖子,表明它沒有。現在似乎無法找到它們。無論如何,它看起來像清理調用取消註冊視圖模型消息。

這是LB自己:

ICleanup的目的是提供一種方式來清理虛擬機(例如 沖洗自己的狀態持久存儲,收盤流等)

from This post on SO

+0

感謝您的意見。也請澄清一下,如果在我的基礎視圖模型中調用Messenger.Default.Unregister(this)就足夠了。我所有的視圖模型都是從一個常見的IDisposable視圖模型(它依次派生自MvvmLight ViewModelBase)派生而來的,我想把這個調用放在基本的Dispose方法的Unregister中。 –

+0

看起來像我錯了,看到其他答案。根據您的其他問題:您可以在您的iDisposable中調用清理,並查看viewmodel定位器的清理方法。你也可以從那裏清理/處置。 –

相關問題