我有一个只读的WPF C#datagrid,它的内容是从外部XML文件加载的,其他表单通过添加,编辑和删除数据来操作XML文件。
我希望在进行更改时重新加载datagrid,但似乎没有一种简单的方法可以做到这一点。
我打算在“编辑”表单关闭时进行某种“刷新”。
我在其他一些失败的代码中尝试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>
答案 0 :(得分:1)
将DataGrid绑定到实现INotifyCollectionChanged接口的集合。实现此接口的对象将在其内容更改时引发事件,DataGrid将侦听这些事件并相应地更新自身。
有一个内置的通用类ObservableCollection,它会为您处理所有这些问题。通常最简单的方法就是使用它。但它确实有一个问题,那就是它只能从主线程修改。如果您需要从另一个线程修改它,请使用Dispatcher.Invoke(或BeginInvoke)以避免出现异常。
请注意,这些只会通知'行级'更改 - 添加,删除,替换集合中的整个对象。要让DataGrid在集合中的对象发生更改时也自行更新,请对它们实施INotifyPropertyChanged。
我意识到这意味着一堆额外的编码,因为你需要在XML和集合之间实现类,但它是首选的选项。在好的方面,它应该表现更好。 DataGrid将只能更新它需要更新的行,而不是完全重绘自身(这在WPF中可能是一项昂贵的操作)。