WPF DataGrid行进入和离开事件

时间:2017-01-08 06:33:23

标签: wpf datagrid

我在一个窗口上工作,该窗口有一个DataGrid,它绑定到一个可观察的集合,该集合包含源自数据库表的项目。我想在输入网格中的行时记住原始项目,并且我想在添加网格中的行时将添加或更新的项目提交到数据库。我需要原始值和修改后的值来找出发生了什么变化。

基本上,当您在数据表中输入数据时,我希望实现与Visual Studio或SQL Developer Studio中相同的行为。

有谁知道怎么做?感谢。

在我当前的实现中,当一个字段被更改时我没有获得该项的原始值,并且还为每个更改的字段调用了OnItemChanged,我宁愿一次提交整行。

以下是我的观点:

<Window x:Class="TourMan.Views.EditPersonsView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="Persons">
   <Grid>
       <DataGrid AutoGenerateColumns="False" HorizontalContentAlignment="Center" ItemsSource="{Binding Persons}" 
        RowBackground="LightGoldenrodYellow" AlternatingRowBackground="PaleGoldenrod" AlternationCount="2"
            CanUserAddRows="True" CanUserDeleteRows="True" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Width ="100" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Address" Width ="250" Binding="{Binding Addresses}"/>
            </DataGrid.Columns>
       </DataGrid>
    </Grid>
</Window>

视图模型:

class EditPersonsViewModel
{
    public ObservableCollection<Person> Persons { get;  }

    public EditPersonsViewModel()
    {
        Persons = Engine.Instance().GetPersons();
        foreach (var person in Persons)
        {
            person.PropertyChanged += OnItemChanged;
        }
        Persons.CollectionChanged += OnCollectionChanged;
    }

    private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Add && e.NewItems != null)
        {
            foreach (var item in e.NewItems)
            {
                Engine.Instance().AddPerson((Person)item);
                ((Person)item).PropertyChanged += OnItemChanged;
            }
        }
        else if (e.Action == NotifyCollectionChangedAction.Remove && e.OldItems != null)
        {
            foreach (var item in e.OldItems)
            {
                Engine.Instance().DeletePerson(((Field)item));
            }
        }
    }

    private void OnItemChanged(object sender, PropertyChangedEventArgs e)
    {
        Engine.Instance().UpdatePerson((Person)sender, null);
    }
}

1 个答案:

答案 0 :(得分:0)

经过漫长而痛苦的搜索,我在https://www.codeproject.com/kb/wpf/wpfdatagridexamples.aspx找到了解决方案,这真的很酷,所以我想分享一下。

集合中的项目需要实现IEditableObject。然后,数据网格将在行编辑开始时调用BeginEdit(),在编辑结束时调用EndEdit()。请参阅这篇精彩文章中的所有细节。