我正在使用 MVVM-Light 框架开发 WPF 数据库应用程序。我正在使用 SimpleIOC 注入我的数据服务,并且我的 ViewModel 连接到 XAML 文件中的视图。然而,当打开新的视图模型时,我通常还需要将另一个对象传递给视图模型(假设我传递了一个 CarId 的整数,以便我可以从数据库中获取实际的 Car)。
现在,在 InitializeComponent() 之后,我通过在视图上使用信使来传递它。然后由 View Model 捕获。这目前确实有效,但它有一些挫折。
首先,直到调用视图模型的构造函数之后才会发送消息。假设我在 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);
}
}
现在,当调用构造函数时,我必须像这样在 View Model 构造函数中初始化 ThisCar,否则在创建 ViewModel 时我会在 ThisCar.Brand 上收到 null 错误。
ThisCar = new CarObject();
然后,在它被初始化为一个空对象之后,Message 会被调用,我会根据 Car ID 从数据库中拉出真正的 Car。
ThisCar = webService.GetCar(carId);
但是,当我这样做时,品牌属性不会更新,因为没有任何东西为品牌调用 OnPropertyChanged。
我有两个解决方法,但它们对我来说更像是黑客。首先是为需要更新的任何属性手动调用 OnPropertyChanged。其次是我删除了所有的小属性,并将所有内容直接绑定到 ThisCar 属性(这意味着我必须在我的模型中实现 INotifyPropertyChanged)。
请让我知道我是否只是挑剔,或者是否有更好的方法来做到这一点。我这样做的方式很有效,但就是不适合我。谢谢你。