2011-05-18 73 views
0

SL4 VS2010 MVVM-light c#,messenger。如何從其他Viewmodel獲得答案

  1. 我有一個父用戶控件調用 一個孩子userControl。 (都有 的ViewModels)

  2. 我使用的MVVM光的使者。(孩子是在家長的標籤一個用戶控件)

  3. 當孩子需要關閉,我們必須檢查某些規則父視圖模型 (父結果是你可以關閉不)。

如何與child-ViewModel通信parent-ViewModel?

消息的孩子家長問我能關閉嗎? 然後,消息父到子返回YES或沒有可能

(我嗎?不喜歡消息發回兩次來回)

我真正想知道是否有任何被通過其他方式在ViewModels中進行這樣的通信?

或者怎麼樣變暗兒童的關閉按鈕,如果父規則不允許孩子關閉。

謝謝你的時間。

+0

你可以更好地描述你的問題嗎? – Rev 2011-05-18 07:21:28

+0

@Rev - 你能否寫出語法正確的評論,特別是在批評原始海報如何描述他的問題時? – jpierson 2012-11-16 20:49:09

回答

0

這很難說,但是從你所描述的東西,它聽起來就像你在那個模型屬於父視圖模型的一些規則。如果您將這些規則推入模型中,父級和子級虛擬機都可以使用這些規則。

但是,如果不是這樣,你總是可以有某種發佈/訂閱關係,無論是家長和孩子註冊和使用這些事件進行溝通。

我傾向於模型的方法。

+0

感謝Ritch,規則是UI規則,例如,父母只有一個標籤打開時,不要關閉孩子。 – ramnz 2011-05-18 14:42:20

+0

你能詳細介紹發佈/訂閱的想法嗎? – ramnz 2011-05-18 14:43:07

2

您應該可以在MVVM-Light中使用Messenger來完成此任務。

子窗口發佈信使通知如下圖所示

var message = new NotificationMessageAction<bool>("CanClose", CloseCallback); 
Messenger.Default.Send(message); 

您可以定義操作回調如下圖所示

如下圖所示

private void CloseCallback(bool result) 
{ 
    if (result) 
     ... do some work and close, may need to use Dispatcher ... 
} 

您可以訂閱關於父母該通知

Messenger.Default.Register<NotificationMessageAction<string>>(
    this, 
    msg => 
     { 
      if (msg.Notification == "CanClose") 
       { 
        // Do the necessary UI logic and send the result back 
        msg.Execute(true); 
       } 
     } 

請讓我知道,如果這有助於。

+0

謝謝,我期待diff比解決方案(雙向溝通消息) – ramnz 2011-05-23 14:31:00

0

您有幾種選擇,但最好的答案可能是適合你的應用程序的整體設計的其餘部分中最好的一個。一個沒有提出的選項是你的child-ViewModel可以引用父視圖模型(這可以在打開子視圖的原始消息內提供),並且子視圖模型可以詢問父視圖模型任何需要通過方法或財產的問題。從子 - 視圖模型

例子查詢:

bool canSave = _parentViewModel.CanSave(childInfo) 

如果你想使用這個孩子從幾種類型的父母,那麼你可以創建確保實施者有CanSave方法總是可以從所謂的接口孩子。

interface ISaveQuerable 
{ 
    bool CanSave(YourType childInfo); 
} 

這只是一個選項,您是否使用短信或直接到視圖模型視圖模型的創建和交流會工作。主要思想是,不要創建回調函數,如果你知道父類應該總是實現一些功能,那麼在消息中提供這個事實會強制這個作爲消息合約的一部分。那些使用消息來創建孩子的人將不得不提供一些實現該接口的東西,並且孩子將保證有一些東西可用來以強類型和編譯時間檢查的方式調用。

+0

是的,我想要做一些這些,但不是說父母/孩子會有耦合嗎? – ramnz 2012-11-19 15:07:36

+0

有一點是不清楚的是,像vm詢問UI然後UI響應這樣的雙向溝通​​......我試圖避免耦合(感謝你們所有人的想法)。如果我的虛擬機的執行某些方法的規則取決於一個UI(在這種情況下計數打開的製表符),那麼虛擬機將不得不知道UI的詳細信息(製表符) – ramnz 2012-11-19 15:20:06

+1

那麼在你的製表符例子中,或許規則不應該是在你的ViewModel中,如果它嚴格地關於表示的問題。或者,如果它屬於您的ViewModel,您的ViewModel可能會處理其他一些類比,而不是將它們稱爲該層中的「選項卡」。 – jpierson 2012-11-19 15:24:42