在源更改时重新加载数据网格

时间:2012-01-16 22:19:56

标签: c# wpf datagrid

我有一个只读的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>

1 个答案:

答案 0 :(得分:1)

将DataGrid绑定到实现INotifyCollectionChanged接口的集合。实现此接口的对象将在其内容更改时引发事件,DataGrid将侦听这些事件并相应地更新自身。

有一个内置的通用类ObservableCollection,它会为您处理所有这些问题。通常最简单的方法就是使用它。但它确实有一个问题,那就是它只能从主线程修改。如果您需要从另一个线程修改它,请使用Dispatcher.Invoke(或BeginInvoke)以避免出现异常。

请注意,这些只会通知'行级'更改 - 添加,删除,替换集合中的整个对象。要让DataGrid在集合中的对象发生更改时也自行更新,请对它们实施INotifyPropertyChanged

我意识到这意味着一堆额外的编码,因为你需要在XML和集合之间实现类,但它是首选的选项。在好的方面,它应该表现更好。 DataGrid将只能更新它需要更新的行,而不是完全重绘自身(这在WPF中可能是一项昂贵的操作)。