2013-08-28 120 views
4

我正在使用MVVM-Light Framework構建WPF數據庫應用程序。我使用SimpleIOC來注入我的數據服務,並且我的ViewModel連接到來自XAML文件的視圖。但是,當打開新的視圖模型時,我通常還需要將另一個對象傳遞給視圖模型(可以說我傳遞一個CarId的整數,以便從數據庫中抓取實際的Car)。將數據傳遞給新ViewModel的最佳方法啓動時

現在我通過在View,InitializeComponent()之後使用一個消息傳遞器。然後這被視圖模型捕獲。這目前確實有效,但它有一些挫折。

首先,直到調用視圖模型的構造函數之後纔會發送消息。比方說,我在ViewModel中有一個ThisCar對象屬性,並且我有一個名爲Brand的字符串的輔助屬性,它返回ThisCar.Brand。

public const string ThisPersonPropertyName = "ThisCar"; 
    private Model.Car _thisCar; 
    public Model.Car ThisCar 
    { 
     get 
     { 
      return _thisCar; 
     } 

     set 
     { 
      if (_thisCar== value) 
      { 
       return; 
      } 

      RaisePropertyChanging(ThisCarPropertyName); 
      _thisCar= value; 
      RaisePropertyChanged(ThisCarPropertyName); 
     } 
    } 

    public const string BrandPropertyName = "Brand"; 
    public string Brand 
    { 
     get 
     { 
      return ThisCar.Brand; 
     } 

     set 
     { 
      if (ThisCar.Brand == value) 
      { 
       return; 
      } 

      RaisePropertyChanging(BrandPropertyName); 
      ThisCar.Brand = value; 
      RaisePropertyChanged(BrandPropertyName); 
     } 
    } 

現在,當構造函數被調用,我在視圖模型構造像這樣初始化ThisCar,否則我得到一個空的錯誤上ThisCar.Brand視圖模型被創建時。

ThisCar = new CarObject(); 

然後,它被初始化爲空的對象後,該消息將被調用,我會拉實車基於車輛ID數據庫。

ThisCar = webService.GetCar(carId); 

然而,當我這樣做,品牌屬性沒有更新,因爲沒有被調用OnPropertyChanged的品牌。

我有兩個解決方法,但他們覺得對我來說更像是黑客。首先是爲需要更新的任何屬性手動調用OnPropertyChanged。其次是我刪除所有的小屬性,並將一切直接綁定到ThisCar屬性(這意味着我必須在我的模型中實現INotifyPropertyChanged)。

請讓我知道如果我只是挑剔,或者如果有更好的方法來做到這一點。我這樣做的方式很有效,但只是不適合我。謝謝。

回答

2

好了,這裏是我想出了,請讓我知道這是一個可怕的想法。

我創建了一個名爲IRepository的接口,因爲我使用依賴注入來創建視圖模型。下面是執行:

public interface IRepository 
{ 
    void GetCarId(Action<int> callback); 
    void SetCarId(int value); 
} 

接下來,我創建從IRepository

public class Repository : IRepository 
{ 
    private int CarId; 
    public void GetCarId(Action<int> callback) 
    { 
     callback(CarId); 
    } 

    public void setDictionary(int carId) 
    { 
     CarId = carId; 
    } 
} 

現在繼承的值傳遞到存儲庫中的一類,我把這個到父視圖模型

r.SetCarId(13); 

並在新視圖中接收模型我將它放在視圖模型構造器中:

public View2ViewModel(IChildView i, IRepository r) 
    { 
     int CarId; 
     r.GetCarId((id) => CarId = id); 
     thisCar = GetCarFromDatabase(CarId); 
    } 

在我看來,在不破壞MVVM模式的情況下解決了這個問題,並且由於我使用的IOC容器將所有接口成員創建爲staic,所以我將在整個剩餘視圖中使用這些數據。

我與此有關的主要問題是它感覺像一個全局變量,但這是我能想到的最好的。請讓我知道這是否是一個非常糟糕的主意。謝謝。

+0

當您擁有目錄應用程序並且您的視圖得到回收時,這不起作用。由於您只記得顯示的最後一項,因此失去了活動的物品堆棧。 –

1

我會投票支持讓模型能夠通知那裏的變化,例如在模型中實現INotifyPropertyChanged。有兩個原因:

  1. 可能有多個地方/視圖您可能需要使用相同的模型,你會不喜歡照顧每個視圖模型作爲屬性變化應該提高哪些其他屬性更改。坦率地說,這是混亂和越野車。

  2. 有時候,在VM層我們可能需要聽取模型的變化,所以在這種情況下,自我通知模型也有幫助。

感謝

+0

現在有道理,我只記得當我第一次學習MVVM時,我看到的消息是將INotifyPropertyChange保留在模型之外。如果不使用信使,您有沒有將參數傳遞給視圖模型的建議? –

相關問題