我希望每次用户修改WPF DataGrid中的数据时都知道。
我可以使用单一事件来做到这一点吗?或者我可以用来覆盖整套数据更改的最小事件集(添加行,删除行,修改行等)是什么?
答案 0 :(得分:3)
我知道这可能比你要求的要多,但是一旦你这样做,就很难回去。无论你绑定到什么......一些List,让该项实现IEditableObject。 这样你就不必担心任何控制/视图实现,事件ets。 更改项目时,数据网格以及过多的.NET控件将IsDirty对象设置为true。
这些不是超级好的链接,但它们会让你开始考虑维护isDirty标志。
https://msdn.microsoft.com/en-us/library/system.componentmodel.ieditableobject(v=vs.110).aspx
object editing and isDirty() flag
http://bltoolkit.net/doc/EditableObjects/EditableObject.htm
这比我习惯的更多:
答案 1 :(得分:1)
通常,在使用MVVM时,将主列表绑定到ObservableCollection,然后将所选项绑定到特定实例。在你的安装者中,你可以举起活动。这将是最合乎逻辑的(读取:我见过的最常见的方法)来捕获数据列表的更新/添加/删除。
答案 2 :(得分:0)
<强> MainWindow.xaml 强>
<Window x:Class="WpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication"
Title="MainWindow" Height="350" Width="525">
<DataGrid x:Name="dataGrid" AutoGeneratingColumn="OnAutoGeneratingColumn">
<DataGrid.Resources>
<Style TargetType="DataGridCell">
<EventSetter Event="Binding.SourceUpdated" Handler="OnDataGridCellSourceUpdated"/>
<EventSetter Event="Binding.TargetUpdated" Handler="OnDataGridCellTargetUpdated"/>
</Style>
</DataGrid.Resources>
</DataGrid>
</Window>
<强> MainWindow.xaml.cs 强>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.dataGrid.ItemsSource = new ObservableCollection<Person>()
{
new Person() { Name = "John", Surname = "Doe" },
new Person() { Name = "Jane", Surname = "Doe" }
};
}
private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var dataGridBoundColumn = e.Column as DataGridBoundColumn;
if (dataGridBoundColumn != null)
{
var binding = dataGridBoundColumn.Binding as Binding;
if (binding != null)
{
binding.NotifyOnSourceUpdated = true;
binding.NotifyOnTargetUpdated = true;
}
}
}
private void OnDataGridCellSourceUpdated(object sender, DataTransferEventArgs e)
{
this.OnDataGridCellChanged((DataGridCell)sender);
}
private void OnDataGridCellTargetUpdated(object sender, DataTransferEventArgs e)
{
this.OnDataGridCellChanged((DataGridCell)sender);
}
private void OnDataGridCellChanged(DataGridCell dataGridCell)
{
// DataContext is MS.Internal.NamedObject for NewItemPlaceholder row.
var person = dataGridCell.DataContext as Person;
if (person != null)
{
var propertyName = ((Binding)((DataGridBoundColumn)dataGridCell.Column).Binding).Path.Path;
var propertyValue = TypeDescriptor.GetProperties(person)[propertyName].GetValue(person);
// TODO: do some logic here.
}
}
}
这是我用于基于Person(只是一些POCO)实例,属性名称和属性值的一些复杂的DataGridCell格式。
但是,如果您希望能够知道何时保存数据并使用MVVM,那么执行此操作的最佳方法是为视图模型/模型中的每个可编辑属性提供原始值和当前值。加载数据时,原始值和当前值将相等,如果通过DataGrid或任何其他方式更改属性,则仅更新当前值。需要保存数据时,只需检查是否有任何项目具有不同的原始值和当前值。如果答案是肯定的,那么应该保存数据,因为自上次加载/保存以来它已被更改,否则数据与加载时相同,因此不需要新的保存。此外,保存时,必须将当前值复制到原始值,因为数据再次等于保存的数据,就像上次加载时一样。
答案 3 :(得分:0)
如果您使用mvvm,您不需要知道“用户修改数据网格中的数据”何时基础集合更改时必须知道。
所以,如果你使用datatable(HasChanges / RejectChanges ......)你就已经内置了所有内容。如果你使用poco集合,那么你的项目至少必须实现INotifyPropertyChanged - 如果它引发了用户修改数据。也许IEditable也适用于拒绝更改等等。