【发布时间】:2013-08-28 20:54:27
【问题描述】:
我正在使用 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从Database中拉取真正的Car。
ThisCar = webService.GetCar(carId);
但是,当我这样做时,品牌属性不会更新,因为没有任何东西为品牌调用 OnPropertyChanged。
我有两个变通方法,但它们对我来说更像是黑客。首先是为需要更新的任何属性手动调用 OnPropertyChanged。其次是我删除了所有的小属性,并将所有内容直接绑定到 ThisCar 属性(这意味着我必须在我的模型中实现 INotifyPropertyChanged)。
如果我只是挑剔,或者是否有更好的方法来做到这一点,请告诉我。我这样做的方式很有效,但就是不适合我。谢谢。
【问题讨论】:
标签: c# wpf mvvm mvvm-light