2013-04-26 59 views
12

我在C#WPF新和正在做的DataGrid一些非常基本的测试。我可以将数据绑定到DataGrid,但在修改该行后,我只能收到旧数据。有人能告诉我我的代码有什么问题吗?这里是我的代码:Datagrid.RowEditEnding不返回更新值

XAML

<Window x:Class="abc.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <DataGrid Name="dgEmployee" AutoGenerateColumns="False" 
        RowEditEnding="OnRowEditEnding"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="ID" Binding="{Binding EmpNo}"/> 
       <DataGridTextColumn Header="Name" Binding="{Binding EmpName}"/> 
       <DataGridTextColumn Header="Salary" Binding="{Binding Salary, 
        StringFormat='#,##0.00'}"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 

代码隐藏

using System.Windows; 

namespace abc 
{ 
    public partial class MainWindow : Window 
    { 
     EmployeeList emp = new EmployeeList(); 


     public MainWindow() 
     { 
      InitializeComponent(); 
      dgEmployee.ItemsSource = emp; 
     } 

     private void OnRowEditEnding(object sender, System.Windows.Controls.DataGridRowEditEndingEventArgs e) 
     { 
      var _emp = e.Row.Item as Employee; 
      MessageBox.Show(string.Format("updated record:\n{0}\n{1}\n{2}", 
      _emp.EmpNo, _emp.EmpName, _emp.Salary)); 
     } 
    } 
} 

,这里是Employee类:

using System.Collections.ObjectModel; 

namespace abc 
{ 
    public class Employee 
    { 
     private int _empNo; 
     private string _empName; 
     private decimal _salary; 

     public Employee(int Id, string Name, decimal wage) 
     { 
      this._empNo = Id; 
      this._empName = Name; 
      this._salary = wage; 
     } 

     public int EmpNo { get { return _empNo; } set { _empNo = value; } } 
     public string EmpName { get { return _empName; } set { _empName = value; } } 
     public decimal Salary { get { return _salary; } set { _salary = value; } } 
    } 

    public class EmployeeList : ObservableCollection<Employee> 
    { 
     public EmployeeList() 
      : base() 
     { 
      Add(new Employee(1, "Bart Simpson", (decimal)10)); 
      Add(new Employee(2, "Homer Simpson", (decimal)500)); 
      Add(new Employee(3, "Maggie Simpson", (decimal)200)); 
     } 
    } 
} 
+0

不知道什么是修正的意思,但也许你需要实现propertychanged? – Landvis 2013-04-26 12:26:37

+0

+1有很多代码的伟大的第一个问题:) – ChrisO 2013-04-26 13:03:47

回答

23

你需要改变你的WPF绑定给力每次更改酒店时都会更新到您的Employee级别。目前,默认情况下,它仅在丢失焦点OnRowEditEnding事件之后发生的更新:

<DataGridTextColumn Header="ID" Binding="{Binding EmpNo, UpdateSourceTrigger=PropertyChanged}"/> 
+0

感谢ChrisO。这样可行!! – Richie 2013-04-26 15:12:21

+0

我真的希望我早些发现这个 – 2015-03-19 23:43:26

+0

太棒了,谢谢! – CINCHAPPS 2017-01-21 13:21:40

0

解决方法: 更新行的静态列表改变 使用另一个事件来更新行( s)roweditending事件后

private void datagrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
    { 
     rows2change.Add(e.Row.GetIndex()); 
    } 

    private void datagrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) 
    { 
     if (rows2change.Count > 0) 
     { 
      saveMyData(rows2change[0]); 
      rows2change.Remove(rows2change[0]); 
     } 
    }