【问题标题】:Add one element to ObservableCollection / DataGrid when it becomes empty当 ObservableCollection / DataGrid 为空时添加一个元素
【发布时间】:2013-08-10 11:53:29
【问题描述】:

我有一个名为MyObservableCollectionObservableCollection<MyItem>。它的项目显示在DataGrid 中。我需要的是,当从DataGrid 中删除所有行时,应添加一个具有默认值的MyItem

如果我一次删除所有行,以下操作将不起作用。当我一个一个删除它们时它会起作用。

void DataGrid_UnloadingRow(object sender, DataGridRowEventArgs e)
{
    myDataGrid.Items.Refresh();
    if (0 == MyObservableCollection.Count)
    {
        MyObservableCollection.Add(new MyItem());
    }
}

我也不能使用CollectionChanged 事件处理程序,因为无法从该处理程序操作集合(会导致无限循环)。

如何实现上述功能?

【问题讨论】:

  • 您能解释一下Also I can't use the CollectionChanged event handler, as the collection cannot be manipulated from that one (would cause an infinite loop 的确切含义吗?您当前的代码有什么问题?
  • 不要像这样操作 UI 事件,用于数据管理。数据就是数据。用户界面就是用户界面。学习 MVVM。
  • Addremove 无条件 时会出现无限循环。 IMO 直接使用 CollectionChanged 事件

标签: c# wpf datagrid observablecollection


【解决方案1】:

订阅CollectionChanged 事件。由于Collection不能在CollectionChanged事件中修改,可以使用Dispatcher类进行修改。请参阅下面的示例代码。

    void MyObservableCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Remove || e.Action == NotifyCollectionChangedAction.Reset)
        {
            if (MyObservableCollection.Count == 0)
            {
                Application.Current.Dispatcher.BeginInvoke(new Action(() =>
                    {
                        MyObservableCollection.Add(new MyItem());
                    }), null);
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2022-01-02
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多