Najlepszy sposób przekazywania danych do nowego ViewModel po jego zainicjowaniu

Pracuję nad aplikacją bazodanową WPF przy użyciu MVVM-Light Framework. Używam SimpleIOC do wstrzykiwania moich usług danych, a moje ViewModele są połączone z widokiem z pliku XAML. Jednak podczas otwierania nowych modeli widoku zwykle muszę także przekazać inny obiekt do modelu widoku (powiedzmy, że przekazuję liczbę całkowitą CarId, aby móc pobrać rzeczywisty samochód z bazy danych).

W tej chwili przekazuję to za pomocą komunikatora na widoku, po InitializeComponent (). Jest on następnie przechwytywany przez model widoku. To działa, ale ma pewne zaległości.

Po pierwsze, wiadomość nie zostanie wysłana, dopóki nie zostanie wywołany Konstruktor modelu widoku. Powiedzmy, że posiadałem właściwość ThisCar w ViewModelu i miałem właściwości dodatkowe, takie jak ciąg o nazwie Brand, który zwraca 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);
        }
    }

Teraz, gdy konstruktor zostanie wywołany, muszę zainicjować ThisCar w konstruktorze modelu widoku, tak jak w innym przypadku, w przeciwnym razie otrzymam błąd null na ThisCar.Brand, gdy ViewModel zostanie utworzony.

ThisCar = new CarObject();

Następnie, po zainicjowaniu do pustego obiektu, wiadomość zostanie wywołana, a ja wyciągnę prawdziwy samochód z bazy danych na podstawie identyfikatora samochodu.

ThisCar = webService.GetCar(carId);

Jednak kiedy to robię, właściwość marki nie jest aktualizowana, ponieważ nic nie nazywa OnPropertyChanged dla marki.

Mam dwie prace dookoła, ale czują się bardziej jak hacki. Najpierw ręcznie wywołuje OnPropertyChanged dla wszelkich właściwości, które wymagają aktualizacji. Po drugie, usuwam wszystkie małe właściwości i wiążę wszystko bezpośrednio z właściwością ThisCar (co oznacza, że ​​muszę zaimplementować INotifyPropertyChanged w moim modelu).

Daj mi znać, jeśli jestem tylko wybredna lub jeśli jest lepszy sposób na to. Sposób, w jaki to robię, działa, ale po prostu nie siedzi ze mną. Dziękuję Ci.

questionAnswers(2)

yourAnswerToTheQuestion