簡體   English   中英

mvvmlight 信使奇怪的行為

[英]mvvmlight messenger strange behaviour

我的項目中有一個奇怪的行為。 我使用 MvvmLight messenger 來通知我 UI 的不同部分進行更新。

   public EntryViewModel(MenuViewModel menuVM, Entry item)
    {
        this._menuVM = menuVM;
        OpenDetailsCommand = new RelayCommand(OpenDetailsInMainWindow);
        BackCommand = new RelayCommand(Back);

        this._entry = item;
        Refresh(); 

        Messenger.Default.Register<CardUpdateMessage>(this, this._entry.Id, msg => Refresh(); );   
 }

並發送

Messenger.Default.Send(new CardUpdateMessage(id), id);

當我在注冊后看到 Messenger 內容時,它包含大約 400 個 CardUpdateMessage 的注冊操作,但是當我調用 send 時,它們都沒有觸發。 順便說一句,每個消息類型具有單個注冊對象的類似代碼按我的預期工作。 這個問題的原因是什么?

更新:我用調試器做了一些研究,發現在文件https://mvvmlight.codeplex.com/SourceControl/latest#GalaSoft.MvvmLight/GalaSoft.MvvmLight (PCL)/Messaging/Messenger.cs 中的方法 SendToList 被觸發並在它的內部循環 WeakAction 被觸發,但 Refresh 方法沒有運行。 這是我對 WeakAction 沒有懷疑的東西嗎?

解決方案:我已經找到了這個問題的案例。 由於意外行為,不允許在 Messenger.Register 中使用匿名函數。 只是Messenger.Default.Register(this, this._entry.Id, Refresh); private void Refresh(CardUpdateMessage msg) ...

外部參考https : //mvvmlight.codeplex.com/workitem/7640

這是答案https://mvvmlight.codeplex.com/workitem/7640和這個奇怪的行為,在 MVVM light Messenger 中有動作、局部變量和垃圾收集

簡而言之,解決方案 - 不要在 Messenger.Default.Register 中使用 lambda,因為它的行為可能與您預期的不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM