12

以前のプロジェクトでは、C++ で元に戻すシステムを既に実装しており、それがどのように機能するかを知っています。コマンドパターンも認識しています。

C#/WPF デスクトップ アプリケーションを実装し、MV-VM パターンに基づいて設計したいと考えています。

アプリケーションは次のことを行います。

  • 比較的小規模なプロジェクトであること (1 人の開発者の推定作業時間は 2 ~ 3 週間)
  • 永続性を備えた単純なデータ モデルを持っている (linq to XML)
  • 元に戻す/やり直しをサポート

MV-VM パターンに従って元に戻すシステムを実装した経験がある人がいるかどうか疑問に思っていました。それにどのように収まりますか?INotifyPropertyChanged および INotifyCollectionChanged 通知からどのように利益を得ることができるので、モデル (ビジネス オブジェクト) を実装するときに最小限の作業で済みます。

元に戻すシステムは、UI の状態であるため、ViewModel レイヤーに何らかの形で統合されると思います。

何か考えはありますか?

4

3 に答える 3

13

これが私のプロジェクトで使用したソリューションです。ソリューションは完全に機能することが証明されました。

システムは元に戻すイベント オブジェクトを使用しており、各元に戻すイベントは、それ自体を元に戻す方法とやり直す方法を認識しています。

interface IUndoEvent
{
    void Undo();
    void Redo();
}

2 つの元に戻すイベントを実装するだけでシステムを構築できました。1 つはプロパティの変更用です。1 つはコレクションの変更用です。

これらのイベントは、モデルを直接変更することによって元に戻す/やり直しを実装するという考え方です。

class PropertyChangeUndoEvent : IUndoEvent
{
    private ModelBase _target;
    private string _propertyName;
    private object _oldValue;
    private object _newValue;

    public PropertyChangeUndoEvent(ModelBase target, string propertyName, object oldValue, object newValue)
    {
        _target = target;
        _propertyName = propertyName;
        _oldValue = oldValue;
        _newValue = newValue;
    }

    public void Undo()
    {
        SetValue(_oldValue);
    }

    public void Redo()
    {
        SetValue(_newValue);
    }

    private void SetValue(object value)
    {
        // Set Value on the _target using reflection (_propertyName)
    }
}

ViewModel は、ViewModelBase 関数を呼び出して元に戻すイベントを作成します。

class MyViewModel : ViewModelBase
{
    public string Name
    {
        get { return _model.Name; }

        // The SetValue will create a undo event, and push it to the UndoManager
        set { SetValue(_model, "Name", value); }
    }
}

最後に、元に戻すスタックとやり直しスタックを格納する UndoManager (プロジェクト シングルトン) があります。

于 2009-10-22T12:22:30.927 に答える
4

Monitored Undo Framework が役立つ場合があります。http://muf.codeplex.com/ . 「トップ ダウン」コマンド パターンを使用しませんが、代わりに発生した変更を監視し、変更を元に戻す元に戻すスタックにデリゲートを配置できるようにします。

これは、MVVM を使用して構築された WPF アプリケーションの一部として作成しました。元に戻すアクションのほとんどは、基になるドメイン モデルで発生しましたが、ビューモデルの一部の領域にもフックして、そこでも元に戻す/やり直しできるようにしました。

http://muf.codeplex.com/の codeplex サイトで詳細情報とドキュメントを見つけることができます。

于 2011-06-21T03:30:55.077 に答える
2

Command パターンを Memento と結合していると思いますか?

元に戻すシステムは、UI の状態であるため、ViewModel レイヤーに何らかの形で統合されると思います。

?! 通常、元に戻す/やり直しはビジネス オブジェクトに作用し、UI はビジネス レイヤーを反映します。

「説明」文字列を持つ製品クラスがあるとします。ProductVM は、PropertyChanged を発生させる文字列プロパティを公開します。変更すると、memento は古いモデル インスタンスを保持します。元に戻す場合は、 ProductVM.Description = (memento as Product).Description を使用して memento を復元します。モデルと UI も更新されます。

NB : (製品としての記念品)は避けてください。サンプルのためだけに ;)

于 2009-05-25T15:39:59.677 に答える