2012-11-06 222 views
5

關於MVVM模式的問題,我認爲我錯了。將對象傳遞給viewmodel

當觸下事件的看法我想彈出一個消息,即:

private void marker_TouchDown(MessageObject msgData) 
{ 
    CustomMessageControl message = new CustomMessageControl() {Width = 610, Height = 332}; 
    CustomMessageViewModel messageVM = new CustomMessageViewModel(msgData); 
    message.DataContext = messageVM; 
    //Add to canvas 
} 

我的視圖模型發生:

public class CustomMessageViewModel 
{ 
    public MessageObject message { get; set; } 

    public CustomMessageViewModel(MessageObject message) 
    { 
     this.MessageObject = message; 
    } 
} 

這工作,但感覺不對。這是一種可接受的方式來填充視圖模型?

+0

通常,viewmodels將使用INPC接口(http://msdn.microsoft.com/zh-cn/library/system.componentmodel.inotifypropertychanged.aspx)來支持通知視圖/使用者屬性已更新。我強烈建議不要在代碼中將datacontext重新綁定到附加在此場景中的新視圖模型中。 –

+0

感謝昆頓,我瞭解使用INPC。我可能從字面上看這個,但這裏有人點擊一個視圖,我想啓動一個新的視圖,傳遞一些與他們點擊的點相關的數據。 –

+1

請原諒我對代碼的看法,你確實在做一般認爲正確的事情,它在代碼中可能看起來不那麼漂亮,但是實例化數據並將其傳遞給視圖模型的標準方式,有幾個MVVM框架可以幫助緩解這種情況在他們的設計中可能會引起你的興趣,但如果你想手動處理這一切,這通常是公認的方法。 –

回答

2

我相信你在視圖模型中創建控件時違反了MVVM。這是不可測試的,您的視圖模型現在已經創建了控件,這不應該成爲測試的要求(這強調了UI與視圖模型之間缺乏關注的分離)。

而不是創建控件,您的視圖模型完全可以觸發它自己的事件。在這種情況下,你會傳遞所需的對話框/覆蓋/控件綁定到視圖模型,這樣的事情:

public class CustomMessageControlEventArgs : EventArgs 
{ 
    public CustomMessageViewModel CustomMessageViewModel { get; set; } 
} 

public event EventHandler<CustomMessageControlEventArgs> 
    ShowCustomMessageControl; 

private void marker_TouchDown(MessageObject msgData) 
{ 
    // Create the view model. 
    var message = ...; 

    // Get the events. 
    var events = ShowCustomMessageControl; 

    // Fire. 
    if (events != null) events(this, 
     new CustomMessageControlEventArgs { 
      MessageObject = new CustomMessageViewModel(msgData) 
     }); 
} 

然後,在你的UI代碼,你會綁定到該事件,然後爲該事件顯示適當的用戶界面。請記住,MVVM並不是嚴格意義上能夠聲明XAML中的所有內容,或者通過將數據綁定到UI,這只是數據綁定,它關係到代碼的正確分離。

希望將分開什麼的顯示(視圖模型)從什麼如何什麼是顯示(用戶界面);在發起事件時,你要保持這種關注的分離。

是的,你必須編寫一些代碼(或者你可以通過屬性通知的改變來做到這一點,但它更醜陋,坦率地說),但它保持了分離,並且允許簡單的可測試性而不需要引入任何用戶界面元素。