在源更改时重新加载数据网格
本文关键字:加载 数据 网格 数据网 新加载 | 更新日期: 2023-09-27 18:20:24
我有一个WPF C#数据网格,它是只读的,它的内容是从外部XML文件加载的,其他表单通过添加、编辑和删除数据来操作XML文件。
我希望在进行更改时重新加载数据网格,但似乎没有简单的方法。
我打算在"编辑"窗体关闭时进行某种"刷新"。
在其他一些失败的代码中,我尝试过datagrid.items.refresh()
,但没有成功。(学习C#/WPF)
我该怎么做?
XAML:
<Grid.DataContext>
<XmlDataProvider Source="E:'downloader'downloadConfig.xml" XPath="/download/downloadItem"></XmlDataProvider>
</Grid.DataContext>
<DataGrid x:Name="downloadList" Height="191" VerticalAlignment="Top" ItemsSource="{Binding}" AutoGenerateColumns="False" AlternatingRowBackground="Gainsboro" IsReadOnly="True" DataContext="{Binding}" IsSynchronizedWithCurrentItem="True">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding XPath=ID}" Width="50"></DataGridTextColumn>
<DataGridTextColumn Header="Name" Binding="{Binding XPath=Name}" Width="350"></DataGridTextColumn>
<DataGridTextColumn Header="Status" Binding="{Binding XPath=Status}" Width="100"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
将DataGrid绑定到实现INotifyCollectionChanged接口的集合。实现此接口的对象将在其内容更改时引发事件,DataGrid将侦听这些事件并相应地更新自身。
有一个内置的泛型类ObservableCollection,它为您处理所有这些。通常使用它最简单。不过,它确实有一个问题,那就是它只能从主线程进行修改。如果需要从另一个线程对其进行修改,请使用Dispatcher.Invoke(或BeginInvoke)来避免出现异常。
请注意,这些仅通知"行级别"的更改,即从集合中添加、删除、替换整个对象。若要在集合中的对象发生更改时使DataGrid也更新自身,请在它们上实现INotifyPropertyChanged。
我意识到这意味着要进行大量额外的编码,因为您需要实现在XML和集合之间的类,但这是首选选项。从好的方面来说,它应该表现得更好。DataGrid将只能更新它需要更新的行,而不是完全重新绘制自己(这在WPF中可能是一项昂贵的操作)。