0

この質問を読んだばかりです: MVVMを使用してオブジェクトの編集をキャンセルするにはどうすればよいですか?

まったく同じ質問があり、簡単な解決策が必要です。最初のものは非常に有望に見えましたが、私はエンティティフレームワークを使用しており、クラスは自動的に生成されるため、それはオプションではありません。

EFでこれを簡単に行うにはどうすればよいですか?

編集:私のViewModel:

public List<Player> Players
{
    get { return repository.Players.OrderBy(x => x.Firstname).ToList(); }
}

public Player CurrentPlayer
{
    get { return currentPlayer;  }
    set
    {
        if (currentPlayer != value)
        {
            currentPlayer = value;
            RaisePropertyChanged("CurrentPlayer");
        }
    }
}

プレーヤーはデータグリッドにバインドされ、CurrentPlayerはその選択されたアイテムにバインドされます。データグリッドの下に、ユーザーがプレーヤー情報を編集できるテキストボックスがあります。

ユーザーが保存ボタンを押すと、次のコードが実行されます。

private void SaveExecute(object parameter)
{
    repository.SavePlayer(currentPlayer);

    Editing = false;
}

非常に簡単。ユーザーがキャンセルボタンを押すと、これが実行されます。

private void CancelExecute(object parameter)
{
    if (currentPlayer.Id == 0) // id = 0 when a new player is being added
    {
        CurrentPlayer = null;
    }
    else
    {
        // here, the CurrentPlayer should be set back to it's previous state.
    }

    Editing = false;
}

CurrentPlayerは、EFによって生成されたエンティティクラスであるPlayerのオブジェクトです。

4

1 に答える 1

0

問題がわかりません。ユーザーが新しいアイテム()を編集している場合は、State == ObjectState.Addedそれを破棄します(そして、[CurrentPlayer新規]ボタンを押す前の状態に設定しますか?)。それ以外の場合は、データベースからエンティティを再度取得するだけです。

この問題を解決するためのより良い方法は、CRUDとリストVMにエンティティの個別のインスタンスを持たせることです。

たとえば、リストビュー(Datagridまたはその他)を作成すると、通常、そこに表示されるデータは、完全なCRUDビューに表示されるデータ全体のサブセットにすぎません。したがって、CRUDでエンティティを表示するにはGet()、必要なを使用してエンティティを再度表示する必要がありIncludesます。これにより、キャンセルの問題全体が解決されます。これは、変更するエンティティインスタンスが、実際にはリストビューに表示されているものと同じではないためです。ユーザーが[保存]を押すと、リストビューに表示されているインスタンスを編集済みのインスタンスに置き換えることができます。ユーザーが[キャンセル]を押した場合は、何もしないでください。

編集:エンティティがEntity Framework STEテンプレートなどのT4テンプレートによって生成されている場合は、.ttファイルを変更してカスタマイズし、エンティティに必要なコードを生成できることにも注意してください。

于 2012-11-18T04:14:25.520 に答える