2012-11-17 118 views
0

我刚读了这个问题: How to cancel an edit to an object using 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"); 
     } 
    } 
} 

玩家绑定到数据网格,CurrentPlayer到了selectedItem属性。在数据网格下面,我有文本框,用户可以在其中编辑播放器信息。

当用户按下保存按钮,该代码被执行:

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

不要使用EF实体,因为您的视图模型将成为我的第一个建议。 –

+1

我不会那样做...... – Bv202

+1

然后,你需要在你用它来检索和存储数据真的不应该不管你在虚拟机中的视图模型视图绑定到一个取消机制方面的机制,你的问题扩大。你有没有做你在做什么的例子,以及为什么在这种情况下使用EF是一个障碍? –

回答

0

我不明白的问题。如果用户正在编辑一个新的项目(State == ObjectState.Added),那么你丢弃,(也许设置CurrentPlayer什么是按“新建”按钮前?),否则只是检索再次从数据库中的实体,就是这样.. 。

一个更好的办法来解决这个问题是让你的CRUD和你的名单VMS具有实体的不同实例。

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

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