2013-04-15 34 views
0

這個問題很簡單,但我無法準確掌握如何去做。反正有沒有通過wpf中的viewmodel來調用命令?

我決定使用WPF,但我不想以經典的方式實現一些MVVM模式。

在我的項目,我決定創建我的模型與INPC,並把它們作爲飼料到我的XAML,好像他們是視圖模型以及..所以不是有:
視圖(< -Binding-> )視圖模型(< -INPC - >)型號

我設計的是:
視圖(< - 結合 - >)模型。

課程的約束是模型必須實現INPC,但是相比於在實踐中的經典MVVM - 模型也需要實現INPC - 所以我覺得我這是由DRY原則導向的高效快捷完全沒有問題。

我也想支持命令,我喜歡命令的概念,並且我理解如何在使用視圖模型時實現命令。但正如我所描述的,我決定跳過視圖模型。

所以提供我已經命令寫成如下:

public class MyCommand : ICommand 
{ 
    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
    //do somthing 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 
} 

,我的XAML看起來財產以後這樣的:

<UserControl x:Class=... blah blah... 
xmlns:Model="clr-namespace:MyProject.BusinessLogic.Person" 
xmlns:Commands="clr-namespace:MyProject.Commands"> 

<TextBox Text="{Binding FirstName}" /> 
<Button Command="What do I put here?" /> 

<UserControl> 

那麼,什麼我把按鈕命令,它允許調用MyCommand (不在模型中)?

+1

豐滿的命令?這些日子裏的術語會變得怪異嗎? – siride

+0

大聲笑,對不起,我會解決它 - 我的意思是鉛垂:) –

+0

這似乎很奇怪,當然任何指揮都與表現邏輯有關,而視圖模型恰恰是放置這個邏輯的地方 – devdigital

回答

1

你確實需要一個視圖模型,這就是你的表現邏輯應該去的地方,包括指揮。

由於您的模型位於System.Windows.Input名稱空間中,因此顯然不能提及ICommand等,因此您需要一種橋接模型與視圖(即視圖模型)的類型。

如果您不希望完全遵循該模式並希望避免將所有視圖模型調用委託給該模型,則可以將該模型作爲視圖模型的屬性公開。

另一個考慮是,如果你在做MVVM,那麼你really should be using an MVVM framework。他們將提供一種替代指揮的方式,這有其侷限性。

例如,如果您希望重新想象您的用戶界面,以便在未啓用時隱藏Button,則無法通過指令輕鬆實現。

諸如Caliburn.Micro之類的MVVM框架提供Actions,它提供了許多優於命令的好處。

+0

實際上,如果你想隱藏一個禁用的按鈕,你可以通過一個觸發器輕鬆實現,具體取決於IsEnabled = false。在這種情況下,按鈕被禁用的方式並不重要。 – hbarck

+1

如果您想保持按鈕處於啓用狀態,但在點擊該對話框時彈出一個對話框表示該操作不可行,該怎麼辦? – devdigital

+0

@ devdigital請包括你給我的評論的答案,所以我可以將這個答案歸功於真正解決了我的問題的答案。 (將模型包含在屬性中並將其展示在虛擬機中 - 這消除了重新聲明所有屬性並規範體系結構的需要) –

1

您可能需要閱讀此:http://wpfglue.wordpress.com/2012/05/07/commanding-binding-controls-to-methods/

的想法是有可重用的組件,允許創建該模型調用的方法的CommandBinding,並且可以在XAML進行配置。所以,「管道」將由這些組件完成,而模型只會實現與業務相關的方法。

這可以概括爲我稱之爲ViewModelKit的東西,即一組組件,它們可以作爲XAML中的資源組裝起來,並覆蓋ViewModel的常見作業。

相關問題