2011-07-18 59 views
1

我正在为WPF桌面应用程序实现MVVM的项目。我有一种想要使Datagrid可编辑的情况,就像旧的MS Access表列表视图一样。我绑定Datagrid的ItemsSource到ObservableCollection成员实现INPC。现在,我想让用户通过单击列的任何单元格来更新成员,当他们导航到其他行或Lost Focus时,应验证数据,然后将其保存到数据库。WPF可编辑DataGrid像MS Access和MVVM

如何在我的ViewModel中捕获这样的事件,以及如何实现这个简单的功能?

回答

0

您可以通过将网格的SelectedItem绑定到您的视图模型上的属性来触发“保存”操作,并且在属性的设置器中,您可以在用新选择的项目替换之前保存先前选择的项目,简短的伪代码会是这个样子:

public MyDataObject SelectedItem 
{ 
    get { return _selectedItem; } 
    set 
    { 
     if (value != _selectedItem) 
     { 
      SaveMyItem(_selectedItem); 
      _selectedItem = value; 
      OnPropertyChanged("SelectedItem"); 
     } 
    } 
} 

private MyDataObject _selectedItem; 
<DataGrid ItemsSource="{Binding MyCollection}" SelectedItem="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged}" ...etc... /> 

当然,你可能需要稍微调整这种方法 - 如果花费的时间显着量以保存修改后的项目,那么你会想要做在后台线程上。如果您将验证指定为网格上列绑定的一部分,则用户将无法选择并编辑新行,直到数据正确验证。

+0

希望这会起作用,只有我应该照顾的事情是,它应该保存在一些后台线程..顺便说一句我只是在寻找一些面向模式的方法,我想到了使用IEditableCollectionView:http:/ /blogs.msdn.com/b/vinsibal/archive/2008/05/20/wpf-3-5-sp1-feature-ieditablecollectionview.aspx。你对这种方法有什么看法? –

+0

我已经尝试在我的DTO上使用IEditObject,它的作用就像一个魅力。但仍然需要在后台线程中保存对象。有一件事我想知道你的方法,如果用户选择一行而他们没有选择另一行,他只需从页面导航即可。它会调用所选属性的setter吗? –

+0

@Shoaib - 是的,只要您在SelectedItem绑定中包含'UpdateSourceTrigger = PropertyChanged',setter将在他们选择新行时被调用。 – slugster

0

我会使用Linq到Sql并将datagrid ItemsSource直接绑定到你想要的表。这将处理所有的变化跟踪,并且当你简单地调用SubmitChanges(你可以在selectedItem改变时你可以做,参见slugster的答案)的时候也会保存到数据库中。

+0

与LinqToSQL它应该可以正常工作,但我不能使用LINQ到SQL,因为我已经使用LLBLGen专业版作为DAL。甚至我也无法将LLBLGen实体传递给我的视图,因为它会将图层紧密结合在一起。我想要一些可以与POCO合作的方式。 –