2013-04-26 7 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

+0

+1たくさんのコードの最初の質問:) – ChrisO

答えて

23

あなたが強制的にあなたのWPFのバインディングを変更する必要がありますプロパティが変更されるたびにEmployeeクラスに更新されます。 OnRowEditEndingイベントの後に発生するフォーカスが失われた時点では、デフォルトでは、それが唯一のアップデート:

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

ありがとうChrisO。それは動作します! – Richie

+0

私は本当にこれを以前に見つけたかったよ –

+0

すごく、ありがとう! – CINCHAPPS

0

回避策: 更新 (行を更新するために、別のイベントを使用を変更する行の静的リストs)に変更することができます。

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]); 
     } 
    } 
関連する問題