2013-03-23 63 views
4

我剛開始使用MvvmCross,但是我沒有找到任何關於如何從ViewModel執行UI代碼的信息。從MVVMCross的ViewModel執行UI代碼

在Caliburn上有協程,所以我可以訪問該視圖並保持ui代碼與viewmodel代碼分離。 在我的第一種情況下,我需要從ViewModel中的命令打開一個dialow,什麼是正確的方法?

現在我正在開發一個WinRT應用程序。

謝謝

+0

除了提供關於您今天可以做什麼的答案,我還添加了https://github.com/slodge/MvvmCross/issues/197 - 如果您有任何請求,請添加它們在 - 永遠快樂考慮,如果有什麼事,我們就可以在所有平臺上:)添加 – Stuart 2013-03-23 21:54:49

回答

13

在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)

日後的維護以替代這種方法上面我有時會走捷徑非常靈活:

  • 一些次我火從視圖模型普通的C#的活動,並有這些
  • 查看回應,有時我有特殊標記的屬性,並從中火UI代碼

對不起使用v3語法 - 但轉換快到了,這就是我現在編碼...

要切換回vNext我想你可能需要:

  • 使用IMessenger代替IMvxMessenger
  • 使用BaseMessage代替MvxMessage
  • 使用Subscribe代替SubscribeOnMainThread - 但是你需要馬歇爾消息到UI線程自己。
+0

哇,感謝您的詳細解釋,我會檢查該分支的明天。我已經習慣了在Caliburn上使用EventAggregator用於其他目的,所以我想我會在家裏:)對不起,我沒有注意到這個插件。感謝您的幫助 – nukedbit 2013-03-23 23:00:28

+0

嗨,我也在iOS應用程序中使用相同的消息傳遞模式,但問題是消息顯示多次。當你在視圖中來回移動時會發生這種情況。恩。我有一個登錄後的登錄視圖和反饋視圖。所以一旦我登錄並移動到反饋視圖,並填寫該網頁的領域,它工作正常。但是如果我現在回到登錄狀態並再次回到反饋視圖並填充字段,並點擊「完成」按鈕,我會收到很多消息。你能指導我解決這種情況嗎? – SoftSan 2014-01-24 09:19:59

+0

我可以將它用於從視圖傳遞給viewmodel的消息嗎? – 2015-05-18 14:23:43