元に戻す/やり直し機能を備えた WPF アプリケーションがあります。データベースとのやり取りには EF を使用します。
UI がいくつかのプロパティを変更したときに通知されるより良いアプローチまたはパターンがあるかどうかを知りたいです。
私が現在使用しているアプローチは次のとおりです。
EF にクラスを生成させます。例えば:
public partial class Page: IObjectWithChangeTracker, INotifyPropertyChanged { #region Primitive Properties [DataMember] public string title { get { return _title; } set { if (_title != value) { _title = value; OnPropertyChanged("title"); } } } private string _title; ...
次に、クラスの非生成部分に、UI 用の別のプロパティを追加します。この特定のケースでは、プロパティは WPF TextBox にバインドされています。
public partial class Page { public Page() { ((INotifyPropertyChanged)this).PropertyChanged += Page_PropertyChanged; } void Page_PropertyChanged(object sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case "title": OnPropertyChanged("titleUI"); break; } } public string titleUI { get { return title; } set { if (value == title) return; string oldValue = title; title = value; UndoRedo.PushAtomic( () => title = oldValue, () => title = value, "change page title"); } } ...
以前はこの目的で FrameworkElement.SourceUpdated をリッスンしていましたが、MVVM 設計パターンにより厳密に従うためにこのアプローチを断念しました。
より良い、またはより簡単なアプローチはありますか?
編集: TextBox をプロパティに直接バインドしない理由はtitle
、プロパティが TextBox 以外のものによって更新されるたびに、元に戻す/やり直しスタックに追加したくないからです。また、EF ObjectContext がエンティティを具体化するとき、値はセッターによって割り当てられ、それを元に戻す/やり直すスタックにも追加したくありません。
編集2:私はこの質問のためにSOをちょっとあきらめました。できれば削除します。たとえば、私のコードが真の MVVM ではないというコメントが、目前の問題とどのように関係しているかを理解できません。エンティティ クラスをいわゆる ViewModel クラスから厳密に分離するかどうかにかかわらず、UI からの更新を「インターセプト」する方法を見つける必要があります。私は閉鎖に投票しました。これがどこにも行かないと私のように感じたら、同じことをしてください.