Beste Methode zum Übergeben von Daten an neues ViewModel, wenn es initiiert wird

Ich arbeite an einer WPF-Datenbankanwendung mit dem MVVM-Light Framework. Ich verwende SimpleIOC, um meine Data Services zu injizieren, und meine ViewModels sind mit der Ansicht aus der XAML-Datei verbunden. Wenn ich neue Ansichtsmodelle öffne, muss ich normalerweise auch ein anderes Objekt an das Ansichtsmodell übergeben (sagen wir, ich übergebe eine Ganzzahl einer CarId, damit ich das tatsächliche Auto aus einer Datenbank abrufen kann).

Im Moment übergebe ich dies mit einem Messenger in der Ansicht nach InitializeComponent (). Dies wird dann vom View Model abgefangen. Dies funktioniert derzeit, hat jedoch einige Nachteile.

Erstens wird die Nachricht erst gesendet, nachdem der Konstruktor des Ansichtsmodells aufgerufen wurde. Nehmen wir an, ich hatte eine ThisCar-Objekteigenschaft im ViewModel und sekundäre Eigenschaften wie eine Zeichenfolge namens Brand, die ThisCar.Brand zurückgibt.

    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);
        }
    }

Wenn nun der Konstruktor aufgerufen wird, muss ich ThisCar im View Model Constructor wie folgt initialisieren, sonst erhalte ich eine Null-Fehlermeldung für ThisCar.Brand, wenn das ViewModel erstellt wird.

ThisCar = new CarObject();

Nachdem es zu einem leeren Objekt initialisiert wurde, wird die Nachricht aufgerufen, und ich werde das echte Auto anhand der Auto-ID aus der Datenbank ziehen.

ThisCar = webService.GetCar(carId);

Wenn ich dies tue, wird die Brand-Eigenschaft jedoch nicht aktualisiert, da OnPropertyChanged für die Marke nicht aufgerufen wird.

Ich habe zwei Workarounds, aber sie fühlen sich für mich eher wie Hacks an. Zunächst wird OnPropertyChanged manuell für alle Eigenschaften aufgerufen, die aktualisiert werden müssen. Zweitens entferne ich alle kleinen Eigenschaften und binde alles direkt an die ThisCar-Eigenschaft (was bedeutet, dass ich INotifyPropertyChanged in meinem Modell implementieren muss).

Bitte lassen Sie mich wissen, ob ich nur wählerisch bin oder ob es einen besseren Weg gibt, dies zu tun. So wie ich es tue, funktioniert es, aber es passt einfach nicht zu mir. Vielen Dank.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage