19

我是 C# WPF 的新手,正在对 DataGrid 进行一些非常基本的测试。我可以将数据绑定到 DataGrid,但是在修改行之后,我只能接收到旧数据。有人可以告诉我我的代码有什么问题吗?这是我的代码:

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

2 回答 2

33

您需要更改 WPF 绑定以在Employee每次更改属性时强制更新回您的类。目前,默认情况下,它仅在 OnRowEditEnding 事件之后发生的焦点丢失时更新:

<DataGridTextColumn Header="ID" Binding="{Binding EmpNo, UpdateSourceTrigger=PropertyChanged}"/>
于 2013-04-26T13:02:21.050 回答
1

解决方法:更新要更改的行的静态列表 在 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]);
        }
    }
于 2018-03-09T10:09:48.170 回答