单元格更改时,Datagrid将值保存在数据库中

时间:2019-12-03 13:31:47

标签: c# wpf mvvm datagrid

嗨,我创建了以下测试代码:

 <Button x:Name="b_Delete" Content="Delete" Margin="10" Grid.Row="1"/>
    <Button x:Name="b_Save" Content="Save" Margin="10" Grid.Row="1" Grid.Column="1" Command="{Binding Path=SaveCommand}"/>
    <DataGrid x:Name="dataGrid" Margin="10" Grid.ColumnSpan="2" ItemsSource="{Binding Path=Books, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False" CanUserAddRows="False">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="Author" Header="Author"  Width="*" Binding="{Binding author, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="HorizontalAlignment" Value="Center" />
                        <Setter Property="VerticalAlignment" Value="Center" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>

            <DataGridTextColumn x:Name="Title" Header="Title"   Width="*" Binding="{Binding title}">
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="HorizontalAlignment" Value="Left"  />
                        <Setter Property="VerticalAlignment" Value="Center" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>

            <DataGridTextColumn x:Name="Price" Header="Price" Width="*" Binding="{Binding price}">
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="HorizontalAlignment" Value="Left" />
                        <Setter Property="VerticalAlignment" Value="Center" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>


            <DataGridTemplateColumn x:Name="Delete_Row" Header="Delete" Width="0.2*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="X"></Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

我创建了两个按钮和一个数据网格。要向datagrid填充读取到数据库中的值,现在,如果用户将文本更改为单元格,则新值将保存到数据库中(按钮X delete into row暂时尚未实现)。

我的想法是制作一个ObservableCollection,在其中添加行更改的信息(删除行的另一个ObservableCollect) 当单击保存按钮时,我将值保存到数据库中,并将值保存到ObservableCollect中。你觉得呢?

如何在数据网格的单元格中拦截值的变化?

 private ObservableCollection<Book> books = null;
    public ObservableCollection<Book> Books
    {
        get { return books; }
        set
        {
            books = value;
            NotifyPropertyChanged();
        }
    }

如果我更改单元格的值,这不是呼叫点吗?

感谢帮助

1 个答案:

答案 0 :(得分:0)

有几种方法可以解决此问题,但我不一定建议“拦截”更改以跟踪更改(特别是如果您使用的是“保存”按钮)。相反,当您从数据库中加载Books列表时,我将制作两个副本:BooksBooksOriginal(或类似的名称)。 Books将是ObservableCollection<T>,但是BooksOriginal只能是普通的List<T>,因为它将不会用于绑定。

DataGrid绑定到Books,然后让用户添加,删除或更新他们想要的任何记录。然后,当他们单击“保存”时,您将BooksBooksOriginal进行比较,以决定如何处理每个项目:

  • 如果Books中的项目不在BooksOriginal中,则它是新的,需要将其插入数据库中。
  • 如果Books中的项目在BooksOriginal中,则比较两个版本以查看它们是否不同。如果是这样,则进行了更改,您需要更新数据库中的记录。
  • 最后,检查BooksOriginal中不在Books中的项目,这些将是已从DataGrid中删除的记录。

这样,数据绑定就可以完成其工作,您只需要担心两个变量(BooksBooksOriginal),并且所有逻辑/代码都保存在一个方法中:{{1} }。

一些注意事项:
假设每个记录都有唯一的标识符。

请确保,如果您使用上述两个集合的想法,请为每本“书籍”制作两个单独的对象。不要制作一个书本对象并将其添加到两个收藏夹中,否则您将无法比较更改。

您还可以选择在加载程序时仅创建一个列表(Save),然后在单击保存时加载第二个列表(Books)。这样做的好处是,在检查更改时,请确保您拥有数据库中的最新数据。