2013-04-26 10 views
12

Jestem nowy w C# WPF i wykonuję bardzo prosty test na DataGrid. Mogę powiązać dane z DataGrid, ale po poprawieniu wiersza mogę otrzymywać tylko stare dane. Czy ktoś może mi powiedzieć, co jest nie tak w moim kodzie? Tu jest mój kodu:Datagrid.RowEditEnding nie zwraca wartości aktualizacji

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> 

Code-za

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)); 
     } 
    } 
} 

i tutaj jest klasa Pracownik:

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

nie jestem pewien, co ammend znaczy, ale może musisz zaimplementować propertychanged? – Landvis

+0

+1 Świetne pierwsze pytanie z dużą ilością kodu :) – ChrisO

Odpowiedz

23

Musisz zmienić swoje powiązania WPF zmusić aktualizację z powrotem do klasy Employee za każdym razem, gdy właściwość zostanie zmieniona. W tej chwili, domyślnie, to tylko aktualizacje, gdy ostrość jest stracone, która dzieje się po OnRowEditEnding imprezy:

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

Dzięki ChrisO. To działa!! – Richie

+0

Naprawdę chciałbym znaleźć to wcześniej –

+0

Awesome, thanks! – CINCHAPPS

0

Obejście: zmiana statycznego lista wierszy zostać zmieniona użyć innego zdarzenia, aby zaktualizować wiersz (s) po zdarzeniu 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]); 
     } 
    } 
Powiązane problemy