0

我刚刚阅读了这个问题: 如何使用 MVVM 取消对对象的编辑?

我有完全相同的问题,并希望有一个简单的解决方案。第一个看起来很有希望,但是,我正在使用实体框架并且我的类是自动生成的,所以这不是一个选项。

如何使用 EF 轻松做到这一点?

编辑:我的视图模型:

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");
        }
    }
}

Players 绑定到一个数据网格,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 是 Player 的一个对象,是 EF 生成的实体类。

4

1 回答 1

0

我不明白这个问题。如果用户正在编辑一个新项目(State == ObjectState.Added),那么您将其丢弃,(并且可能将其设置CurrentPlayer为按下“新建”按钮之前的状态?),否则只需再次从数据库中检索实体,就是这样......

解决此问题的更好方法是让您的 CRUD 和您的列表 VM 具有单独的实体实例。

例如,当我创建一个列表视图(Datagrid 或其他)时,通常其中显示的数据只是完整 CRUD 视图中显示的整个数据的一个子集。因此,为了在 CRUD 中显示实体,我需要Get()再次使用必要的Includes. 这解决了整个取消问题,因为您正在修改的实体实例实际上与列表视图中显示的不同。如果用户按下保存,您可以将列表视图中显示的实例替换为已编辑的实例,如果用户按下取消,则不执行任何操作。

编辑:另外请注意,如果您的实体是由 T4 模板(例如实体框架 STE 模板)生成的,您可以修改 .tt 文件并对其进行自定义以生成您在实体中需要的任何代码。

于 2012-11-18T04:14:25.520 回答