WPF DataGrid具有RowEditEnding但没有RowEditEnded

时间:2010-10-11 15:37:51

标签: wpf datagrid

我已将ObservableCollection绑定到DataGrid。当我更改DataGrid中的值时,会引发RowEditEnding事件。但是e.Row.Item是编辑前的对象,因此您看不到新值。据我所知,因为EditEnding。在Silverlight中,您有一个EditEnded事件,当我编辑DataGrid时,如何使用新值获取对象。

感谢,

菲利普

5 个答案:

答案 0 :(得分:9)

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c38fc695-d1ec-4252-87b7-feb484ee01e4/,将Binding的UpdateSourceTrigger更改为PropertyChanged。然后,在RowEditEnding事件之前立即更新该属性,并且可以从RowEditEnding事件处理程序访问新值。

例如,对于DataGridComboBoxColumn

SelectedItemBinding="{Binding ForTestResult, UpdateSourceTrigger=PropertyChanged}"

这似乎是解决此问题的一种非常简单的方法。

此外,虽然我还没有尝试过,但我认为如果您的对象实现了IEditableObject,那么在编辑之前也应该很容易访问原始值。

答案 1 :(得分:6)

嗯,也许这可能会有所帮助:http://wpf.codeplex.com/Thread/View.aspx?ThreadId=39356

http://blogs.msdn.com/b/vinsibal/archive/2009/04/14/5-more-random-gotchas-with-the-wpf-datagrid.aspx

或者,请参阅第5点。

你必须修补它以获得你想要的东西,但我希望有所帮助!或者指出你的方向很好。

答案 2 :(得分:1)

这个解决方案似乎很简单。参考msdn forum

private void dgEmployees_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{           
    Action action = delegate
                  {
                     Employee emp = e.Row.Item as Employee;
                    //do something nice to the employee                
                   };
    Dispatcher.BeginInvoke(action, System.Windows.Threading.DispatcherPriority.Background);
}

答案 3 :(得分:0)

附加到ObservableCollection的已更改事件。

我绑定到DataTable并使用了RowChanged事件。

答案 4 :(得分:0)

我最新的和IMHO最快的方法是添加bool rowEdited=false,然后在true内将其设置为DataGrid_RowEditEnding,并将{editEnded'的代码放在DataGrid_LayoutUpdated内:

if (rowEdited)
{
    //main code here//
    rowEdited=false;
}