我正在使用MVVM-Light框架开发一个WPF数据库应用程序。我使用SimpleIOC来注入我的数据服务,我的ViewModel与XAML文件中的视图相连接。然而,当打开新的ViewModel时,我通常还需要传递另一个对象给ViewModel(假设我传递的是CarId的整数,这样我就可以从数据库中获取实际的汽车)。
目前,我在InitializeComponent()之后使用View上的信使来传递此内容,然后由ViewModel接收。当前这种方法可以工作,但也有一些缺点。
首先,直到调用ViewModel的构造函数之后才会发送消息。假设我在ViewModel中有一个ThisCar对象属性,并且我有像Brand这样的辅助属性,它返回ThisCar.Brand。
然而,当我这样做时,品牌属性并没有被更新,因为没有任何调用Brand的OnPropertyChanged方法。
我有两个解决方案,但它们感觉更像是hack。 第一个是手动调用需要更新的所有属性的OnPropertyChanged方法。第二个是我删除了所有小属性,并直接将所有内容绑定到ThisCar属性上(这意味着我必须在模型中实现INotifyPropertyChanged)。
请告诉我是否只是我的一些挑剔,或者是否有更好的方法来解决这个问题。我的做法虽然可行,但让我感觉不对劲。谢谢!
目前,我在InitializeComponent()之后使用View上的信使来传递此内容,然后由ViewModel接收。当前这种方法可以工作,但也有一些缺点。
首先,直到调用ViewModel的构造函数之后才会发送消息。假设我在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,否则在创建ViewModel时,ThisCar.Brand会得到null错误。
ThisCar = new CarObject();
在初始化为空对象后,Message将被调用,并且我将根据Car ID从数据库中获取真实的Car。
ThisCar = webService.GetCar(carId);
然而,当我这样做时,品牌属性并没有被更新,因为没有任何调用Brand的OnPropertyChanged方法。
我有两个解决方案,但它们感觉更像是hack。 第一个是手动调用需要更新的所有属性的OnPropertyChanged方法。第二个是我删除了所有小属性,并直接将所有内容绑定到ThisCar属性上(这意味着我必须在模型中实现INotifyPropertyChanged)。
请告诉我是否只是我的一些挑剔,或者是否有更好的方法来解决这个问题。我的做法虽然可行,但让我感觉不对劲。谢谢!