2012-07-14 70 views
0

我認爲我對MVVM設計模型有很好的理解,但是我對WPF,Command綁定以及我們如何使用它們有興趣。MVVM - 與WPF命令綁定標準相關

要直接將命令綁定到XAML,我們打算在ViewModel中實現ICommand接口。現在,ICommand接口是PresentationCore.DLL的一部分,如果im錯誤是WPF而不是基本.NET框架的一部分,那麼請糾正我。

是不是ViewModel和Model的整個點,它應該完全UI獨立?例如,如果我在ViewModel中實現ICommand並將其用作數據上下文以綁定來自XAML的命令,則我的ViewModel不依賴於WPF框架工作(特別是PresentationCore.Dll)。

我的意思是,如果我要去嘗試使用我的模型和ViewModels可以說Windows窗體環境,我將不得不引用PresentationCore.DLL,即使我不應該需要它,因爲即時通訊使用Windows窗體而不是WPF框架。

這對我來說似乎有點奇怪,我在這裏錯過了什麼嗎?有沒有另外一種方法可以讓我的Model和ViewModel完全獨立於UI和UI框架,但是仍然能夠在XAML中使用Command綁定?

在此先感謝!

+0

在這一點上我有我自己唯一的解決辦法是創建兩個視圖模型,有一個XXXViewModel和XXXViewModelWPF繼承自XXXViewModel幷包含所有與ICommand相關的東西,那麼XXXViewModelWPF類只會成爲WPF。有沒有更好的辦法?謝謝 – 2012-07-14 06:20:47

回答

1

我也有這種問題,但不是在wpf中,而是在POCO類中。我所做的是我在兩個不同的程序集中創建了兩個部分類。就像你創建一個不是presentationcore.dll依賴於您的VM項目的分部類,並在另一個實現ICommand的程序集(比如WPFVM)中創建它的分部類。現在Winforms的東西只添加VM項目引用到View項目,而WPF的東西添加VM和WPFVM到View項目的引用。我希望這將有所幫助。

+0

感謝ethicallogics,我決定已經這樣做了,除了使用部分類im,我將爲每個ViewModel創建一個叫做XXXViewModelWPF的子類,它具有ICommand屬性。正如你所說,這樣我就不會在我的Windows窗體實現中包含XXXViewModelWPF!這是個好主意,謝謝。 – 2012-07-14 06:41:32

1

MVVM的意義在於讓視圖成爲視圖,僅此而已。將ICommands放入視圖模型會有助於實現這一點,因爲它將代碼從視圖中拉出。如果您必須訪問不屬於依賴項屬性的視圖上的某些內容,這意味着您無法綁定它。

+0

感謝您的回答,所以我對MVVM模型的解釋是不正確的? ViewModel的重點不是從邏輯中抽象視圖,而是從視圖中移除所有代碼。所以如果我要將我的程序移動到Windows窗體,我將不得不重新編寫視圖模型和視圖,而不僅僅是視圖?我認爲設計模式的重點是限制UI設計更改時所需的返工? – 2012-07-14 06:24:32

+0

MVVM是專門爲WPF設計的。我不知道它將如何與Windows窗體一起工作。我同意限制返工,但是因爲WPF和Winforms是如此不同,所以我不知道在視圖模型中切換即使沒有ICommmand也是多麼容易。 – jle 2012-07-14 06:33:01

+0

好的,謝謝,我真的沒有看到使用我的ViewModels和Models在Windows窗體應用程序中,目前除了ICommand實現外。例如,Windows窗體控件可能包含對ViewModel的引用,並掛鉤其OnPropertyChanged事件以根據需要使其自身失效。 Paint消息將根據ViewModel的當前狀態進行簡單繪製。我想我會在原始問題的主題中使用我的評論,你能想到其他方式嗎? – 2012-07-14 06:37:01

1

在我看來,MVVM非常受WPF和Silverlight的歡迎,因爲它自然適合它。 XAML中的數據綁定概念允許使用DataContext的單個屬性來橋接視圖模型的視圖&。由於您的邏輯不再與控件綁定,因此您可以獲得更好的可測試性,設計代碼分離和可維護性。您也許能夠在其他地方實現MVVM模式,但在WPF和Silverlight中,由於其數據和命令綁定支持,它非常​​適合。我曾在某處讀過,不要虔誠地採取模式。他們是爲了讓你的生活變得更簡單,而不是在追隨它時給你更多的問題。對於Winforms,我認爲有更好的模式,如果您專注於重用業務邏輯,請將它們從ViewModel中移出,以便像服務提供商或服務代理那樣分離類,然後在Winforms和WPF應用程序之間共享它們。

+0

感謝Moble Joseph,我想可以這樣做,但對我來說,更多的不便是試圖將所有業務邏輯抽象爲單獨的類,而不直接訪問要應用於這些業務規則的信息。所有的數據都需要傳遞給這些類。我仍然認爲我的最佳選擇是創建WPF命令的後代ViewModels,unles im不能正確理解你? – 2012-07-14 06:56:54

+0

那麼目前你在這些命令中做你的業務邏輯?您不使用某個數據傳輸對象將業務規則分離到單獨的類中? – 2012-07-14 07:12:00

+0

邏輯並不十分複雜,以至於程序dosnt使用數據庫作爲後端,它只是存儲在模型中的對象的狀態信息,然後ViewModel負責通過事件通知事件的視圖(在這種情況下是PropertyChanged事件)。所以是的,程序的所有邏輯都在ViewModel中,據我所知,基本的MVVM只支持Model,ViewModel和查看任何額外的東西在MVVM之上?如果你想知道它的拼字遊戲板解算器。然而,求解器代碼被抽象爲單獨的類 – 2012-07-14 07:22:11

1

這改變了在.NET 4.5比較

+0

感謝這個1月,我不知道是否有人在微軟閱讀我的意見,並決定移動它,但現在它是系統中的.NET基礎框架的一部分,歡呼聲! – 2013-05-19 11:18:31