我正在使用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)。
請讓我知道如果我只是挑剔,或者如果有更好的方法來做到這一點。我這樣做的方式很有效,但只是不適合我。謝謝。
當您擁有目錄應用程序並且您的視圖得到回收時,這不起作用。由於您只記得顯示的最後一項,因此失去了活動的物品堆棧。 –