我剛開始使用MvvmCross,但是我沒有找到任何關於如何從ViewModel執行UI代碼的信息。從MVVMCross的ViewModel執行UI代碼
在Caliburn上有協程,所以我可以訪問該視圖並保持ui代碼與viewmodel代碼分離。 在我的第一種情況下,我需要從ViewModel中的命令打開一個dialow,什麼是正確的方法?
現在我正在開發一個WinRT應用程序。
謝謝
我剛開始使用MvvmCross,但是我沒有找到任何關於如何從ViewModel執行UI代碼的信息。從MVVMCross的ViewModel執行UI代碼
在Caliburn上有協程,所以我可以訪問該視圖並保持ui代碼與viewmodel代碼分離。 在我的第一種情況下,我需要從ViewModel中的命令打開一個dialow,什麼是正確的方法?
現在我正在開發一個WinRT應用程序。
謝謝
在MvvmCross中沒有任何硬/快速規則。
通常,當我需要這樣做時,我使用Messenger插件。
此答案假定您使用的是最新的Alpha v3
代碼。對於較舊的vNext代碼,您需要進行一些翻譯 - 請參閱下面的註釋。
要使用這種方法:
我引用Cirrious.MvvmCross.Plugins.Messenger.dll
從核心和UI項目。
然後我在Setup.cs某處添加一行(例如,在InitializeLastChance
)到:
Cirrious.MvvmCross.Plugins.Messenger.PluginLoader.Instance.EnsureLoaded();
然後在覈心項目,我添加一條消息:
public class InputIsNeededMessage : MvxMessage
{
public InputIsNeededMessage(object sender) : base(sender) {}
}
在視圖模型,我可以通過構造函數注入或獲得的使者:
var messenger = Mvx.Resolve<IMvxMessenger>();
messenger.Publish(new InputIsNeededMessage(this));
01:我可以通過調用發送消息
在查看我還能回到信使和使用訂閱的消息:
var messenger = Mvx.Resolve<IMvxMessenger>();
_token = messenger.SubscribeOnMainThread<InputIsNeededMessage>(OnInputIsNeeded);
其中_token
必須是一個成員變量 - 如果它不是,則認購事項將不會繼續存在 - 訂閱本身是弱默認(所以你從來沒有退訂)
何OnInputIsNeeded
是一樣的東西:
private void OnInputIsNeeded(InputIsNeededMessage message)
{
if (message.Sender != ViewModel)
return;
// do stuff here - you are already on the UI thread
}
上述順序是什麼,我通常對「正確的代碼」
首先使用信使/ EventAggregator可以感到不舒服做的 - 它肯定花了一段時間來習慣它 - 但我確實後習慣了它,然後我現在在任何地方使用它 - 發佈/訂閱消息解耦是用於測試和代碼(IMO)
日後的維護以替代這種方法上面我有時會走捷徑非常靈活:
對不起使用v3
語法 - 但轉換快到了,這就是我現在編碼...
要切換回vNext
我想你可能需要:
IMessenger
代替IMvxMessenger
BaseMessage
代替MvxMessage
Subscribe
代替SubscribeOnMainThread
- 但是你需要馬歇爾消息到UI線程自己。哇,感謝您的詳細解釋,我會檢查該分支的明天。我已經習慣了在Caliburn上使用EventAggregator用於其他目的,所以我想我會在家裏:)對不起,我沒有注意到這個插件。感謝您的幫助 – nukedbit 2013-03-23 23:00:28
嗨,我也在iOS應用程序中使用相同的消息傳遞模式,但問題是消息顯示多次。當你在視圖中來回移動時會發生這種情況。恩。我有一個登錄後的登錄視圖和反饋視圖。所以一旦我登錄並移動到反饋視圖,並填寫該網頁的領域,它工作正常。但是如果我現在回到登錄狀態並再次回到反饋視圖並填充字段,並點擊「完成」按鈕,我會收到很多消息。你能指導我解決這種情況嗎? – SoftSan 2014-01-24 09:19:59
我可以將它用於從視圖傳遞給viewmodel的消息嗎? – 2015-05-18 14:23:43
除了提供關於您今天可以做什麼的答案,我還添加了https://github.com/slodge/MvvmCross/issues/197 - 如果您有任何請求,請添加它們在 - 永遠快樂考慮,如果有什麼事,我們就可以在所有平臺上:)添加 – Stuart 2013-03-23 21:54:49