2012-08-04 47 views
1

我有一個簡單的視圖模型處置靜態資源的ViewModels

public class TestViewModel : ViewModelBase, IDisposable 
    { 

    public TestViewModel() 
    { 
     Messenger.Default.Register<string>(this, MessageHandling); 
    } 

    public void MessageHandling(string message) 
    { 
     System.Windows.MessageBox.Show(message); 
    } 
    public override void Cleanup() 
    { 
     Messenger.Default.Unregister(this); 
     base.Cleanup(); 
    } 
    } 

我用它在我的XAML是這樣的:

<Window.Resources> 
    <ResourceDictionary> 
     <vm:TestViewModel x:Key="ViewModel"></vm:TestViewModel> 
    </ResourceDictionary> 
    </Window.Resources> 
    <Grid DataContext="{Binding Source={StaticResource ViewModel}}"> 
    </Grid> 

任何人的幫助,我們與放置該視圖模型中,通過設置我意味着我應該訂閱哪個事件來調用VM方法清理?因爲如果我不做清理,ViewModel保留在內存中,仍然處理消息。 我希望我提前

+0

看來,你正在使用'MVVM光Toolkit',是正確的? – 2012-08-04 10:25:50

+0

@Paul Michalik正確,但我不使用ViewModelLocator如果這是你的下一個問題:) – Miran 2012-08-04 10:44:25

回答

2

首先這取決於你的解釋得當:)

感謝,當你想處理它。你沒有說清楚。我第一次以爲你的意思是「當應用程序關閉時」,那麼我會使用exit事件。但我對你的陳述感到惱火

因爲如果我不做清理,ViewModel保留在內存中, 仍然處理消息。我希望我解釋得很好

什麼只能發生,如果你想處置,但你的應用程序仍然需要運行。如果您的應用程序關閉,則不會留在內存中,也不會再處理消息。但它依然是不錯的做法,不依賴於此。

所以如果你的意思是「當應用程序關閉時」,這是你的答案。

+0

好吧,我擔心我沒有解釋我的需要很好。例如。這個窗口是我的應用程序中的一些窗口/控件,我打開/使用它來做一些使用虛擬機的工作,然後關閉這個窗口並打開另一個用於其他目的,但具有相同viewmodel類(不同實例),但我的虛擬機保留因爲Messenger類有一個用於接收消息的引用。我想要/需要的是當我的窗口/控件不再使用時調用我的虛擬機的清理方法的事件。註釋卸載事件不好(使用製表符和切換原因Cleanup) – Miran 2012-08-04 10:43:28

+0

如果其窗口可以使用[Closed](http://msdn.microsoft.com/en-us/library/system.windows.window。 closed.aspx)事件。 – dowhilefor 2012-08-04 11:11:44

+0

是的,窗戶很好,控件怎麼樣? – Miran 2012-08-04 11:15:14

0

有一個解釋爲什麼即使您執行取消註冊和解決方法,Messenger仍然會引起強烈的引用。

你FrameworkElement的( 「查看」)可以調用清理您的視圖模型無負載時發生的情況:

+0

是的我已經閱讀,這很好,我試圖找到什麼時候調用清理我的viewmodel – Miran 2012-08-04 11:32:06

+0

謝謝,但我已經嘗試過這種方法的Unloaded事件,這對大多數情況是好的,但我需要另一個因爲Unloaded事件發生在從可視樹中刪除窗口/控件但不一定關閉的時候。示例是選項卡控件,在選項卡之間切換會導致Unload事件,並且我的VM從消息中取消註冊,但這不是我想要的行爲,因爲我希望VM仍然附加到消息,直到我處置我的控制權。我是否設法解釋我的問題? – Miran 2012-08-04 11:42:32

+0

只需使用不同的TabControl切換標籤頁,就可以防止卸載行爲。 http://www.codeproject.com/Articles/212233/Persist-the-Visual-Tree-when-switching-tabs-in-the和其他解決方法http://stackoverflow.com/questions/2238072/tabcontrol-disposes-無效標籤 – 2012-08-04 12:02:23