绑定对象和取消按钮

时间:2012-11-17 22:42:23

标签: c# wpf entity-framework mvvm

我刚读过这个问题: How to cancel an edit to an object using 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是Player的一个对象,它是由EF生成的实体类。

1 个答案:

答案 0 :(得分:0)

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

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

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

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