WPF DataGrid:使用MVVM立即保存单元格更改 [英] WPF DataGrid: Save cell changes immediately with MVVM
问题描述
我简化了一个DataGrid,看起来像这样:
I have a DataGrid simplified looking like this:
<DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding Parts}"
SelectedItem="{Binding SelectedPart}" >
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name, Mode=TwoWay}" />
<DataGridTemplateColumn Header="PartType" >
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.PartTypes}"
SelectedItem="{Binding PartType, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding PartType}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我的ViewModel看起来像这样:
My ViewModel looks something like this:
public class PartListViewModel
{
private ObservableCollection<Part> _parts;
public ObservableCollection<Part> Parts
{
get { return _parts; }
set
{
_parts = value;
OnPropertyChanged("Parts");
}
}
private Part _selectedPart;
public Part SelectedPart
{
get { return _selectedPart; }
set
{
_selectedPart = value;
OnPropertyChanged("SelectedPart");
}
}
}
现在我想更改datagrid单元立即存储到数据库中。
Now I want changes to datagrid cells being stored immediately to the database. How to do that in MVVM?
当前,我听DataGrid的 OnCellEditEnding
事件并将记录保存在背后的代码。但这很丑陋:
Currently I listen to the OnCellEditEnding
event of the DataGrid and save the record in the code-behind. But that is pretty ugly:
private void DataGrid_OnCellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
var viewModel = (PartListViewModel) DataContext;
viewModel.SavePart((Part) e.Row.Item);
}
推荐答案
您可以执行以下操作。
(您需要添加对 System.Windows.Interactivity
,您可以从此处下载程序集)
You can do something like this.
(you need to add reference to System.Windows.Interactivity
, you can download the assemblies from here)
然后在其中添加对命名空间的引用XAML。
xmlns:i = http://schemas.microsoft.com/expression/2010/interactivity
Then add reference to the namespace in the XAML.
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<i:Interaction.Triggers>
<i:EventTrigger EventName="CellEditEnding">
<i:InvokeCommandAction Command="{Binding SomeCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
这篇关于WPF DataGrid:使用MVVM立即保存单元格更改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!