我刚读过这个问题: 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生成的实体类。
答案 0 :(得分:0)
我不明白这个问题。如果用户正在编辑新项目(State == ObjectState.Added
),那么您会丢弃该项目(并且可能会在按下“新建”按钮之前将CurrentPlayer
设置为它是什么?),否则只需从中检索实体数据库又来了,就是这样......
解决此问题的更好方法是让您的CRUD和列表虚拟机具有该实体的单独实例。
例如,当我创建List视图(Datagrid或其他)时,通常显示的数据只是完整CRUD视图中显示的整个数据的子集。因此,为了在CRUD中显示实体,我需要使用必要的Get()
再次Includes
该实体。这解决了整个取消问题,因为您正在修改的实体实例实际上与列表视图中显示的实例不同。如果用户按下保存,您可以将列表视图中显示的实例替换为已编辑的实例,如果用户按下取消,则不执行任何操作。
编辑:还要注意,如果您的实体是由T4模板(如实体框架STE模板)生成的,则可以修改.tt文件并对其进行自定义,以生成实体中所需的任何代码。