我使用DataGrid
向用户显示我的数据。编辑后,更新后的数据应直接存储到数据库中,而不使用任何“保存”数据。按钮。
到目前为止,这是我的解决方案,适用于所有DataGrid
列,ComboBox
使用EventTrigger
到InvokeCommandAction
:
<DataGrid ItemsSource="{Binding Path=Animals, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectionMode="Single" AutoGenerateColumns="False" CanUserSortColumns="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="RowEditEnding">
<i:InvokeCommandAction Command="{Binding SaveCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<DataGrid.Columns>
<DataGridTextColumn Header="EPC" Binding="{Binding Epc, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Header="Visual ID" Binding="{Binding VisualId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Header="Geschlecht" Binding="{Binding Gender, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTemplateColumn Header="Bucht">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.Pens, RelativeSource={RelativeSource AncestorType={x:Type view:AdministrationView}}}" DisplayMemberPath="Name" SelectedItem="{Binding Pen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValue="{Binding Pen.PenId}" SelectedValuePath="PenId"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
如何在更改ComboBox选项后在我的视图模型中调用SaveCommand?
或者是否有一个更简单的解决方案来实现我想要的行为(每次编辑后自动保存到数据存储)?
答案 0 :(得分:1)
在您的ViewModel中,我假设您选择的项目是这样定义的吗?
object selectedPen;
public object SelectedPen
{
get
{
return selectedPen;
}
set
{
if (selectedPen != value)
{
selectedPen = value;
DoSave(); // insert saving logic here
OnPropertyChanged("SelectedPen");
}
}
}
您可以在设置器中更改值时调用保存。
答案 1 :(得分:1)
执行此操作的方法是在ViewModel上实施IEditableObject并实施DataGrid.CellEditEnding
和DataGrid.CurrentCellChanged
。
有关详细信息,请参阅Colin Eberhardt撰写的this博文。
private DataRowView rowBeingEdited = null;
private void dataGrid_CellEditEnding(object sender,
DataGridCellEditEndingEventArgs e)
{
DataRowView rowView = e.Row.Item as DataRowView;
rowBeingEdited = rowView;
}
private void dataGrid_CurrentCellChanged(object sender, EventArgs e)
{
if (rowBeingEdited != null)
{
rowBeingEdited.EndEdit();
}
}
答案 2 :(得分:1)
如果您只是添加另一个EventTrigger
来激活您的ICommand
,则会获得所需的行为:
<DataGridTemplateColumn Header="Bucht">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.Pens, RelativeSource={RelativeSource AncestorType={x:Type view:AdministrationView}}}" DisplayMemberPath="Name" SelectedItem="{Binding Pen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValue="{Binding Pen.PenId}" SelectedValuePath="PenId">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding DataContext.SaveCommand, RelativeSource={RelativeSource AncestorType={x:Type view:AdministrationView}}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>