【问题标题】:Wpf Datagrid Delete Row issueWpf Datagrid删除行问题
【发布时间】:2012-05-20 20:06:13
【问题描述】:

我是 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>

请帮助我。谢谢。

【问题讨论】:

    标签: wpf datagrid delete-row


    【解决方案1】:

    您的 DataGrid 的 ItemsSource 在 Model.CurrentDataTable 上有一个绑定。如果要删除一行,则必须删除该集合中的项目。但如果集合没有实现INotifyCollectionChanged,DataGrid 不会注意到该修改。

    .NET 有一个内置的ObservableCollection,它实现了 INotifyCollectionChanged。如果您将此集合类型用于 CurrentDataTable,则 DataGrid 将在集合被修改时自行更新。

    【讨论】:

    • ObservableCollection dtCollection= this.ItemsSource as ObservableCollection; dtCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(dtCollection_CollectionChanged);喜欢这样吗?
    • 嗯,不。您的基础数据列表(原始帖子中的 Model.DataTable)应该是 ObservableCollection,因此您可以将其用作 XAML 代码中的绑定源。然后,DataGrid 将自动附加到列表的 CollectionChanged 事件。请阅读 MSDN 上的备注和示例。 Data Binding Section 也应该对您有所帮助。
    【解决方案2】:

    WPF 数据绑定意味着您很少直接操作用户界面。您要做的是直接从 UI 上的网格控件中删除该行,这可能是您在 Winforms 中处理事物的方式。

    使用 WPF 数据绑定,用户界面会对基础数据做出反应。因此,在您的情况下,网格被绑定到(或“观看”)绑定指定的 ItemsSource 的内容:Binding Model.CurrentDataTable

    要删除一行,您需要将其从基础数据中删除,UI 会自动反映更改。

    这就是 ObservableCollectionINotifyPropertyChanged 的全部意义所在 - 如果您正在进行 WPF 开发,您真的需要阅读它们!

    【讨论】:

    • 是的,你完全正确,我只想做到这一点。但我的删除按钮是 ICommand。我怎样才能做到这一点。 _removeSelectedRowCommand = new DelegateCommand(RemoveSelectedRow, true); private void RemoveSelectedRow() { DataView view = this.ItemsSource as DataView; view.Table.Rows[this.SelectedRowIndex].Delete(); this.Items.Refresh(); }
    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 2011-09-17
    • 1970-01-01
    • 2012-02-03
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多