Обновить сетку данных при изменении источника - PullRequest
0 голосов
/ 17 января 2012

У меня есть таблица данных 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>

1 Ответ

1 голос
/ 17 января 2012

Свяжите DataGrid с коллекцией, которая реализует интерфейс INotifyCollectionChanged . Объекты, которые реализуют этот интерфейс, будут вызывать события, когда их содержимое изменяется, и DataGrid будет прослушивать эти события и соответственно обновляться.

Существует встроенный универсальный класс ObservableCollection , который позаботится обо всем этом для вас. Обычно проще всего его использовать. Тем не менее, у него есть одна ошибка: его можно изменить только из основного потока. Если вам нужно изменить его из другого потока, используйте Dispatcher.Invoke (или BeginInvoke), чтобы избежать получения исключений.

Обратите внимание, что они только уведомляют об изменениях на уровне строк - добавление, удаление, замена целых объектов из коллекции. Чтобы DataGrid также обновлялся при изменении объектов в коллекции, внедрите в них INotifyPropertyChanged .

Я понимаю, что это означает кучу дополнительного кодирования, поскольку вам нужно реализовать классы для перехода между XML и коллекцией, но это предпочтительный вариант. С другой стороны, он должен работать лучше. DataGrid сможет обновлять только те строки, которые ему нужно обновить, а не полностью перерисовывать себя (что может быть дорогой операцией в WPF).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...