爲了實現MVVM設計模式,您不需要遵循嚴格規則的最終主集合。實際上,這些指導方針一般都是模糊。
從我所看到的,有幾種不同的方法可以將模型暴露給視圖。它們是:
方法1 - INotifyPropertyChanged的示範
public class Car : INotifyPropertyChanged
{
private string _Model;
public string Model
{
get { return _Model; }
set
{
_Model = value;
NotifyOfPropertyChange();
}
}
...
}
public class CarViewModel
{
//The entire model is exposed to the view.
public Car Model { get; set; }
...
方法2 - INotifyPropertyChanged的在視圖模型
public class CarViewModel
{
private Car _Car;
//The model property is exposed to the view, not the model itself.
public string CarModel
{
get { return _Car.Model; }
set
{
_Car.Model = value;
NotifyOfPropertyChange();
}
}
...
在方面優選方法,我會說方法2是更好的選擇。爲什麼?
- Model對象不會暴露給視圖。
- 視圖模型僅公開視圖需要的內容。
方法2有其缺點。想象一下,如果您需要暴露批次的模型屬性,或者想象一下,如果您的模型發生變化,那麼更容易在模型中簡單實現INotifyPropertyChanged
並將其暴露給視圖。程序員本質上是懶惰的,因此爲了節省麻煩,你會看到方法1和方法2一樣多。
但是那不是是壞事。
是否比其他方式更「正確」?或者我只是做錯了,而且使它複雜化了?
請記住,MVVM設計模式只是一種模式。這兩個選項都不是正確的,只要MVVM的主要概念在那裏,那麼它們大多是由開發人員的偏好決定的,他們是如何選擇接近模式的實現的,這就是最重要的。
哇,謝謝你的非常完整的答案。我很感激。當我繼續我的項目時,我害怕的是進入方法2的缺點。它開始看起來像我的代碼變得混亂,難以控制。在繼續之前,我想看看我是否可以將它重構成更簡單的東西。當我偶然發現Xamarin樣本時,我認爲他們的代碼看起來非常乾淨並且容易遵循。所以,我以一種奇怪的方式傾向於重構更多的方法1方法,但不是出於懶惰哈哈。 – jmichas
我同意,方法2是相當純粹的方法,而方法1更容易管理。你會發現你自己的風格和偏好。祝你好運! –