Проблема удаления строки Wpf Datagrid

Я новичок в WPF. Я хочу удалить строку из среды выполнения сетки данных. Когда я пытаюсь удалить строку, подобную этой

Datagrid.Items.Remove(eRow);

Это дает мне сообщение об ошибке «Ошибка: операция недействительна, пока используется ItemsSource. Вместо этого получите доступ и измените элементы с помощью ItemsControl.ItemsSource».

Я читал в Интернете, что вы можете использовать ObservationCollection и InotifyPropertyChangedEvent, но я не знаю, как это реализовать.

У меня есть кнопка удаления, как это

введите здесь описание изображения

Это датасет

    <ctrls:RhinoDataGrid x:Name="dataGrid" Grid.Row="1" Margin="5" ItemsSource="{Binding Model.CurrentDataTable}"   
                             Style="{StaticResource RhinoDataGridBaseStyle}" IsReadOnly="{Binding Model.IsLinkFile}"
                             SelectedValue="{Binding Model.CurrentDataRow}" SelectedValuePath="Row"
                              >

            </ctrls:RhinoDataGrid>

Пожалуйста, помогите мне. Спасибо.


person Dee Choksi    schedule 12.05.2012    source источник


Ответы (2)


ItemsSource вашего DataGrid имеет привязку к Model.CurrentDataTable. Если вы хотите удалить строку, вам придется удалить элемент в этой коллекции. Но DataGrid не заметит эту модификацию, если коллекция не реализует INotifyCollectionChanged< /а>.

В .NET есть встроенная коллекция ObservableCollection, реализующая INotifyCollectionChanged. Если вы используете этот тип коллекции для CurrentDataTable, DataGrid будет обновляться при изменении коллекции.

person rumpelstiefel    schedule 12.05.2012
comment
ObservableCollection‹DataTable› dtCollection= this.ItemsSource as ObservableCollection‹DataTable›; dtCollection.CollectionChanged += новый NotifyCollectionChangedEventHandler(dtCollection_CollectionChanged); Как это правильно? - person Dee Choksi; 12.05.2012
comment
Ну нет. Ваш базовый список данных (Model.DataTable в исходном сообщении) должен быть ObservableCollection‹YourCustomDataClass›, чтобы вы могли использовать его в качестве источника привязки в коде XAML. Затем DataGrid автоматически прикрепится к событию CollectionChanged вашего списка. Пожалуйста, прочитайте примечания и примеры на MSDN. Раздел привязки данных также должен вам помочь. - person rumpelstiefel; 13.05.2012

Привязка данных WPF означает, что вы очень редко управляете пользовательским интерфейсом напрямую. То, что вы пытаетесь сделать, это напрямую удалить строку из элемента управления сеткой в ​​пользовательском интерфейсе, как вы могли подойти к вещам в Winforms.

При привязке данных WPF пользовательский интерфейс реагирует на базовые данные. Итак, в вашем случае сетка привязана (или «наблюдает») к содержимому ItemsSource, указанному привязкой: Binding Model.CurrentDataTable

Чтобы удалить строку, вам нужно удалить ее из базовых данных, и пользовательский интерфейс автоматически отразит это изменение.

Это то, что ObservableCollection и INotifyPropertyChanged — вам действительно нужно прочитать о них, если вы делаете WPF-развитие!

person MarcE    schedule 12.05.2012
comment
Да, вы абсолютно правы, я хочу добиться только этого. Но моя кнопка «Удалить» — это ICommand. Как я могу этого добиться. _removeSelectedRowCommand = новая DelegateCommand (RemoveSelectedRow, true); private void RemoveSelectedRow() { Представление DataView = this.ItemsSource as DataView; view.Table.Rows[this.SelectedRowIndex].Delete(); это.Элементы.Обновить(); } - person Dee Choksi; 13.05.2012