私のWPFアプリケーションでは、データをフェッチするためにWCFサービスを使用します。 当然ながら、ある時点で私はDataContract
をWPFアプリケーション全体に渡す必要がある「複雑な」オブジェクトを持っていました。観測可能なデータコントラクトと双方向バインディング
もちろん、私は変更に対応する必要があります。私はViewModelsにINotifyPropertyChanged
を実装しますが、実際には一部のオブジェクトは実際にはDataContractsなので、INotifyPropertyChangedを実装するように再構成する必要があります。
私はそれが乱雑であるように感じます。
私がしようとしたのは、DataContract定義にインターフェイスを直接実装することですが、変更に適切に対応することはできません。
たとえば、双方向データ・バインドTextBox
のテキストが変更されている場合、対応するSQL表の値をWCFサービスを介して変更することによってViewModelが対応する必要がありますが、オブジェクトはWCF側で定義されているため、プロパティの設定者でそれを行うことはできません。
私が今行っているのは、DataContractsのPropertyChangedイベントを購読し、リフレクションを使用して、変更されたプロパティとその新しい値を知ることです。
しかし、これらのオブジェクトはObservableCollection<T>
に保持されています。これは多くのイベントですが、非常に脆いと感じています...たとえば、コレクションから要素を追加/削除するとどうなりますか?
私は、この(これが悪いと思う)のようにそれを実行します。
foreach (ImageInfo imgi in (param.Images as ObservableCollection<ImageInfo>))
{
imgi.PropertyChanged += (sender, args) =>
{
object newValue = Tools.GetProperty((sender as ImageInfo), args.PropertyName);
};
}
そして私は、WCFサービスにそれを送り返すと思います。
もっと洗練されたソリューションがありますか? ViewModelにのみINotifyPropertyChangedを実装し、代わりにDataContractsを再構成する必要がありますか?
ありがとうございます!
私はこれをどのように説明することができます。データコントラクトは単純なオブジェクトです。ビューモデルは、コンストラクタパラメータとしてデータコントラクトを受け取り、それ自身のプロパティを記入します。ユーザーが保存ボタンをクリックすると、ビューモデルは新しい値を収集し、新しいデータコントラクトを作成してサービスに送信します。 – vorrtex
はい、私は「保存」ボタンを持っていません。DBの変更を反映するために、プロパティが変更されるたびにサービスを呼び出す必要があります。 –
これは難しく、データベースの作業量が増えます。しかし、もし私にそのような要求があったとしても、私は同じことをするでしょう:データ契約が一つの財産だけであっても、新しいデータ契約を作り、それをサービスに送ってください。 RaisePropertyChangedメソッドにメソッド呼び出しを追加する場合は、ライブ変更を処理できます。メインのビューモデル内でSaveメソッドを呼び出すか、子アイテムから何らかの種類のMessengerクラスを使用します。 – vorrtex