Лучший способ передать данные в новую ViewModel, когда она инициируется
Я работаю над приложением базы данных WPF, используя MVVM-Light Framework. Я использую SimpleIOC для внедрения моих Data Services, и мои ViewModels подключены к представлению из файла XAML. Однако при открытии новых моделей просмотра мне обычно также необходимо передать другой объект в модель представления (скажем, я передаю целое число CarId, чтобы я мог получить фактический автомобиль из базы данных).
Прямо сейчас я передаю это с помощью мессенджера в представлении после InitializeComponent (). Это тогда поймано моделью Представления. В настоящее время это работает, однако у него есть некоторые недостатки.
Во-первых, сообщение не отправляется до тех пор, пока не будет вызван конструктор модели представления. Допустим, у меня было свойство объекта ThisCar в ViewModel, и у меня были вторичные свойства, такие как строка с именем 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 при создании ViewModel.
ThisCar = new CarObject();
Затем, после инициализации пустого объекта, будет вызвано Сообщение, и я вытащу реальный Автомобиль из базы данных на основе идентификатора автомобиля.
ThisCar = webService.GetCar(carId);
Однако, когда я делаю это, свойство бренда не обновляется, потому что ничто не вызывает OnPropertyChanged для бренда.
У меня есть два обходных пути, но они больше походят на меня. Сначала включается OnPropertyChanged вручную для любых свойств, которые необходимо обновить. Во-вторых, я удаляю все небольшие свойства и привязываю все непосредственно к свойству ThisCar (что означает, что я должен реализовать INotifyPropertyChanged в моей модели).
Пожалуйста, дайте мне знать, если я просто привередлив, или есть лучший способ сделать это. То, как я это делаю, работает, но просто нене сидеть рядом со мной. Спасибо.