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.
}
}
}
Это то, что я использовал для некоторых сложных DataGridCell форматирования на основе Person (только некоторые POCO), например , имя свойства и значение свойства.
Но если вы хотите знать, когда сохранять данные и использовать MVVM, лучшим способом сделать это было бы иметь исходное значение и текущее значение для каждого редактируемого свойства в вашей модели/модели представления. Когда данные будут загружены, исходное и текущее значение будут равны, и если свойство будет изменено с помощью DataGrid или любым другим способом, обновится только текущее значение. Когда данные необходимо сохранить, просто проверьте, имеет ли какой-либо элемент какое-либо свойство, имеющее другое исходное и текущее значение. Если да, то данные должны быть сохранены, поскольку они были изменены с момента последней загрузки/сохранения, в противном случае данные будут такими же, как при загрузке, поэтому никаких новых изменений не требуется. Кроме того, при сохранении текущие значения должны быть скопированы в исходные значения, поскольку данные снова равны сохраненным данным, например, когда они были загружены в последний раз.
Используете ли вы шаблон дизайна, например MVVM или MVC, или просто выполняете прямой код? – Josh
Я использую mvvm. Я хочу использовать это, чтобы иметь возможность сказать, когда мне нужно сохранить данные. –
http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.selectedcellschanged.aspx – Habib