2016-01-29 108 views
0

我們可以使用我的ViewModel中面向UI/UI框架的程序集中的類嗎?MVVM ViewModel和屬性類型(PresentationCore.dll)

今天我對question進行了討論,其中一個人對PresentationCore.dll中的這些類非常執着,不能在ViewModel中使用(好像他還沒有使用過ICommand)但是對嗎?

由於我的理解MVVM只是一個解耦的模式,ViewModal的View?它只是沒有創建視圖(ViewModel沒有直接引用視圖或有關視圖的特定實現或類型)的知識,並沒有說明我可以在ViewModel中使用的類的類型。

請不要回答,因爲什麼是一個好的做法或不,我只是想明確MVVM。

+2

從架構的角度來看,在視圖模型中定義類型的組件並不重要。事實上,在視圖模型中常常會出現一些來自PresentationCore的類型,例如Geometry,Color,Brush,BitmapSource等。但是,它們都有共同之處,那就是它們不是Visuals。 – Clemens

+1

@Clemens我同意。但是如果我使用一些可視的屬性而不是創建視圖(我只想使用一個函數或者說該類的枚舉)呢? –

+1

我已閱讀鏈接問題的討論。 @Tseng只是不明白,視圖模型的解耦視圖是什麼,看起來有點狂熱。無論如何,你的理解是正確的。 – Dennis

回答

5

有時MVVM看起來像是有自己的趨勢的宗教。 :)

下面是MVVM門下的成員之間聖戰主題:

  • 視圖第一VS視圖模型第一;
  • 做/不公開PresentationFramework/WindowsBase類型從視圖模型;
  • 通過您的視圖模型確實/不公開模型,並將視圖直接綁定到模型;
  • 轉換器vs查看模型屬性;
  • 聚合模型中查看模型/地圖模型數據查看模型;
  • 使用事件聚合器/使用服務。

最危險的是「純粹的MVVM」狂熱分子。沒有人確切知道什麼是「純粹的MVVM」,但是如果你違背了他們的信念,他們已經準備好焚燬你。

MVVM只是希望你從視圖模型邏輯保持視圖邏輯分開。
這就是全部

從上面的列表只是一組方法,而不是dogmata。而且,實際上,它們都適合MVVM。使用或不使用只是方便和當前項目體系結構的問題。從以前的問題/答案

-1

簡單的例子:SolidColorBrush

此類型在兩個不同的程序集中聲明:Windows.Foundation.UniversalApiContract(UWP應用程序)和PresencationCore.dll(WPF)。他們都不同的類型,有不同的命名空間和不同身份(一種身份連接到它的組裝。

TypeA組件A比assemblyB類型A不同,你不能傳遞AssemblyA.TypeA爲對象期望AssemblyB.TypeA

它爲什麼重要?

採取這一視圖模型爲例

// WPF namespace 
using System.Windows.Media; 

public class ExampleViewModel : ViewModelBase 
{ 
    public SolidColorBrush Color { get; set; } 
} 

當您使用此WPF中,所有的罰款和工作。現在你想創建一個UWP應用程序,這是行不通的。 UWP不知道PresentationCore.dll中的System.Windows.Media.SolidColorBrush。它只知道來自Windows.Foundation.UniversalApiContract.dll的Windows.UI.Xaml.Media.SolidColorBrush,即使它們具有相同的方法,相同的參數甚至相同的實現,它們也是不同的。

更糟糕的是,因爲你的視圖模型需要PresentationCore.dll中,它必然依賴於.NET 3.x或4.x版,而UWP是基於WinRT的/核心框架。

這是一個緊密的耦合。現在假設你也想使用Xamarin(基於單聲道的Crossplatform .NET框架),並且SolidColorBrush在ie Xamarin.Forms.dll(我沒有使用Xamarin,我不確定它甚至有一個這樣的名稱類型)。

Linux/Mono版本如何?單聲道沒有WPF。控制檯程序?他們甚至不使用UI元素。

然後你就不能綁定它,你最終會複製你的ViewModels和複製你的表現邏輯等

你的「MVVM」的方法,你可測試性增加,但尚未進行歸檔的可重用性和解耦。

有沒有規範告訴你:「這必須這樣做。」。 MVVM不是規範,而是(架構)模式。

爲了上述示例的緣故,如果您需要確定顏色,請使用非ui特定類型(stringColor或您自己的顏色類/結構實現)。

對於視圖,實現一個`IValueConverter'(見this answer爲例)。

現在,您擁有可以重複使用的美麗的解耦代碼,並且每個UI平臺都可以以自己的方式處理顏色。

而且它是那麼容易,因爲直接返回SolidColorBrush在的幾行代碼的成本。最好的是,您可以在任何地方和每個創建的應用程序中重複使用ColorToSolidColorBrushValueConverterColorToSolidColorBrushValueConverter不依賴於您的特定應用程序,並且您的應用程序/視圖模型不依賴於它。

不難寫出好代碼,你就必須嘗試;)

+3

通常情況下,您將不會/不能在不進行條件編譯的情況下在WPF和UWP應用程序之間共享源代碼。而且,並非每個視圖模型都將用作跨平臺。因此,如果我編寫WPF應用程序,我可以使用對PresentationFramework和'System.Windows.Media'的引用。如果我寫跨平臺的東西,我會使用一些條件編譯,或者我會在別處放置特定於平臺的代碼。無論如何,這取決於正在編寫什麼項目。 – Dennis

+0

@Tseng你爲什麼要把MVVM放在中心,並且一直圍繞着說話。問題很簡單,那就是它們的聯繫?可以有數百萬種不同的設計比MVVM更好或者更改MVVM,但這不在此處。 –

+0

這並不像實現一個簡單的'IValueConverter'並去掉'SolidColorBrush'引用是很困難的。出於完全相同的原因,有一個開箱即用的轉換器用於布爾到可見性(因爲可見性只對WPF有意義)https://msdn.microsoft.com/zh-cn/library/system.windows。 controls.booleantovisibilityconverter(v = vs.110).aspx – Tseng

1

請通過下面的鏈接:

The MVVM Pattern

MVVM Basics

有沒有這樣的限制的物業類型。此模式只有通過使用ViewModel圖層將視圖和模型解耦