簡單的例子: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特定類型(string
,Color
或您自己的顏色類/結構實現)。
對於視圖,實現一個`IValueConverter'(見this answer爲例)。
現在,您擁有可以重複使用的美麗的解耦代碼,並且每個UI平臺都可以以自己的方式處理顏色。
而且它是那麼容易,因爲直接返回SolidColorBrush
在的幾行代碼的成本。最好的是,您可以在任何地方和每個創建的應用程序中重複使用ColorToSolidColorBrushValueConverter
。 ColorToSolidColorBrushValueConverter
不依賴於您的特定應用程序,並且您的應用程序/視圖模型不依賴於它。
不難寫出好代碼,你就必須嘗試;)
從架構的角度來看,在視圖模型中定義類型的組件並不重要。事實上,在視圖模型中常常會出現一些來自PresentationCore的類型,例如Geometry,Color,Brush,BitmapSource等。但是,它們都有共同之處,那就是它們不是Visuals。 – Clemens
@Clemens我同意。但是如果我使用一些可視的屬性而不是創建視圖(我只想使用一個函數或者說該類的枚舉)呢? –
我已閱讀鏈接問題的討論。 @Tseng只是不明白,視圖模型的解耦視圖是什麼,看起來有點狂熱。無論如何,你的理解是正確的。 – Dennis