嗨,我创建了以下测试代码:
<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();
}
}
如果我更改单元格的值,这不是呼叫点吗?
感谢帮助
答案 0 :(得分:0)
有几种方法可以解决此问题,但我不一定建议“拦截”更改以跟踪更改(特别是如果您使用的是“保存”按钮)。相反,当您从数据库中加载Books
列表时,我将制作两个副本:Books
和BooksOriginal
(或类似的名称)。 Books
将是ObservableCollection<T>
,但是BooksOriginal
只能是普通的List<T>
,因为它将不会用于绑定。
将DataGrid
绑定到Books
,然后让用户添加,删除或更新他们想要的任何记录。然后,当他们单击“保存”时,您将Books
与BooksOriginal
进行比较,以决定如何处理每个项目:
Books
中的项目不在BooksOriginal
中,则它是新的,需要将其插入数据库中。Books
中的项目在BooksOriginal
中,则比较两个版本以查看它们是否不同。如果是这样,则进行了更改,您需要更新数据库中的记录。BooksOriginal
中不在Books
中的项目,这些将是已从DataGrid
中删除的记录。这样,数据绑定就可以完成其工作,您只需要担心两个变量(Books
和BooksOriginal
),并且所有逻辑/代码都保存在一个方法中:{{1} }。
一些注意事项:
假设每个记录都有唯一的标识符。
请确保,如果您使用上述两个集合的想法,请为每本“书籍”制作两个单独的对象。不要制作一个书本对象并将其添加到两个收藏夹中,否则您将无法比较更改。
您还可以选择在加载程序时仅创建一个列表(Save
),然后在单击保存时加载第二个列表(Books
)。这样做的好处是,在检查更改时,请确保您拥有数据库中的最新数据。