MVVM-Light フレームワークを使用して WPF データベース アプリケーションに取り組んでいます。SimpleIOC を使用して Data Services を挿入しています。ViewModel は XAML ファイルからビューに接続されています。ただし、新しいビュー モデルを開くときは、通常、別のオブジェクトをビュー モデルに渡す必要もあります (データベースから実際の車を取得できるように、CarId の整数を渡すとします)。
現在、InitializeComponent() の後に、ビューでメッセンジャーを使用してこれを渡しています。これは、View Model によってキャッチされます。これは現在のところ機能しますが、いくつかの欠点があります。
まず、ビュー モデルのコンストラクターが呼び出されるまで、メッセージは送信されません。ViewModel に ThisCar オブジェクトの Property があり、ThisCar.Brand を返す 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();
次に、空のオブジェクトに初期化された後、メッセージが呼び出され、車の ID に基づいてデータベースから実際の車を取得します。
ThisCar = webService.GetCar(carId);
ただし、これを行うと、ブランドの OnPropertyChanged を呼び出すものがないため、ブランド プロパティは更新されません。
回避策は 2 つありますが、どちらかというとハックのように感じます。まず、更新が必要なプロパティに対して OnPropertyChanged を手動で呼び出します。2 つ目は、小さなプロパティをすべて削除し、すべてを ThisCar プロパティに直接バインドすることです (つまり、モデルに INotifyPropertyChanged を実装する必要があります)。
私がうるさいだけなのか、それとももっと良い方法があるのか教えてください。私がやっている方法はうまくいきますが、私には合いません。ありがとうございました。