2012-12-22 108 views
0

感謝您的第一反應。我試過了,它工作。我沒有使用附加的行爲。我使用了EventTrigger。MVVM Light Messenger多次執行動作

的xmlns:交互= 「CLR-名稱空間:System.Windows.Interactivity;裝配= System.Windows.Interactivity」

<interactivity:Interaction.Triggers> 
    <!-- In order to Call Cleanup in ViewModel to unregister Messenger. --> 
    <interactivity:EventTrigger EventName="Unloaded"> 
     <interactivity:InvokeCommandAction Command="{Binding ViewUnloadCommand}" /> 
    </interactivity:EventTrigger> 
</interactivity:Interaction.Triggers> 

然後我的視圖將調用視圖模型的命令來註銷信使當該視圖被卸載。

再次感謝。


感謝Laurent爲您在MVVM燈上的精彩工作。

我一直在使用這個框架的WPF項目。然後我遇到了這個問題。我試圖在Google,MSDN和StackOverFlow上搜索它。當在ViewModel和View之間使用Messgener時,我發現了這個解決方案。我會在CodeBehind文件中做這樣的事情,在Unloaded事件處理程序中調用Unregister。

但是,當我在ViewModel中這樣做,當我應該調用Unregister或Cleanup?因爲當它發生時我仍然需要再次收到此消息。但我不希望多次只收到一次這個消息。

在此先感謝。

/// <summary> 
    /// Register to be observer of TodoItems change notification receiver. 
    /// </summary> 
    private void RegisterTodoItemsChangedNotification() 
    { 
     Messenger.Default.Register<UnfinishedTodoItemTreeViewModel>(this, UnfinishedTodoItemTreeViewModel.RelatedTodoItemsChangedMessageToken, itemTreeViewModel => 
     { 
      if (itemTreeViewModel.ActionCategory == UnfinishedTodoItemTreeViewModel.TodoItemActionCategory.Done) 
      { 
       DecreaseRelatedFilterTodoItemCount(itemTreeViewModel.FilterType); 
       AllTodoItemCount -= 1; 
      } 
      else if (itemTreeViewModel.ActionCategory == UnfinishedTodoItemTreeViewModel.TodoItemActionCategory.Undone) 
      { 
       IncreaseRelatedFilterTodoItemCount(itemTreeViewModel.FilterType); 
       AllTodoItemCount += 1; 
      } 
     }); 
    } 

回答

0

在視圖模型中,只要有意義,您應該取消註冊。我猜你會想要做到這一點,當它被約束的控制被卸載?

你可以爲此寫一個附加的行爲 - 只知道爲什麼卸載可能引發的其他原因。一個例子見this answer

+0

感謝您的評論。我會嘗試一下並儘快得到結果。 – Hui

+0

再次感謝。你剛給我看了一個正確的方向。它實際上工作。但我沒有使用附加的行爲。我使用EventTrigger來調用ViewModel中的命令來取消註冊Messenger。 – Hui

相關問題