在DataGrid中编辑后直接保存实体

时间:2015-07-07 08:20:15

标签: c# wpf entity-framework mvvm

我使用DataGrid向用户显示我的数据。编辑后,更新后的数据应直接存储到数据库中,而不使用任何“保存”数据。按钮。

到目前为止,这是我的解决方案,适用于所有DataGrid列,ComboBox使用EventTriggerInvokeCommandAction

    <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>

enter image description here

如何在更改ComboBox选项后在我的视图模型中调用SaveCommand?

或者是否有一个更简单的解决方案来实现我想要的行为(每次编辑后自动保存到数据存储)?

3 个答案:

答案 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.CellEditEndingDataGrid.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>