【问题标题】:Overriding ObservableCollection<T> - The Easy Way覆盖 ObservableCollection<T> - 简单的方法
【发布时间】:2014-12-15 14:31:12
【问题描述】:

我正在尝试做一些相当简单的事情,但对 .Net 感到沮丧:

我只是想要一个 WPF DataGrid,它会在末尾自动添加一个空白行,类似于在 MS Access 或 SQL Management Studio 中的表中输入数据。

我的想法是重写 ObservableCollection:保留一个 newItem 成员,我会在读取 Items 集合时动态添加该成员。像这样的:

// Warning this code doesn't work
public class MyCollection<T> : ObservableCollection<T>
{
    private T _newItem;

    // there would be a constructor which would initialize _newItem

    protected override IList<T> Items
    {
        get
            {

                List<T> newItems = new List<T>();
                newItems.Add(_newItem);
                return base.Items.Union(newItems).ToList();
            }
    }
}

我的代码有几个问题。首先,您不能覆盖 Items 属性的 getter。它是不可覆盖的。

其次,即使可以,当 DataGrid 绑定到集合时,甚至不会调用该 getter。我认为 GetEnumerator 方法应该在这里被覆盖,但当然也不能被覆盖。

扩展 ObservableCollection 类以实现此功能的最简单方法是什么。在这一点上,看起来我必须自己实现整个事情,而不是从 ObservableCollection 继承。出于显而易见的原因,我反对这个想法。

提前致谢!

【问题讨论】:

  • 也许可以从 DataGrid 方面着手。
  • DataGrid 为此有一个build-in feature
  • 如果您使用 mvvm,您的视图模型可以随时向集合中添加一个空白项。无需覆盖任何东西
  • blindmeis,我想你可能是对的。这可能是最简单的方法。谢谢。让它成为一个答案,我会这样标记它。

标签: c# wpf generics datagrid observablecollection


【解决方案1】:

据我所知,如果您将CanUserAddRows 设置为 True,DataGrid 确实会在底部显示一个空白行并且确保您的 DTO 类具有默认构造函数.这对你的情况不起作用吗?

无论如何,您都试图通过修改数据源来解决 UI 问题,因此遇到问题也就不足为奇了。这清楚地表明这不是要走的路。

【讨论】:

  • 我熟悉 DataGrid 的那个特性,但是我不喜欢 UX。在编辑表数据时,真的是在尝试复制 Access 或 SQL Management Studio 的体验。
  • 所有这些都是你应该在你的视图或用户控件中解决的 UI 问题,而不是它背后的数据。看来实际问题根本不是如何显示新行,而是如何创建不同的 UI,同时保持数据绑定简单。例如。您可以在主网格正下方添加一个单行数据网格,将其绑定到单个对象并处理将新行传输到代码中的主 collection。考虑使用已经提供此功能的另一个网格。一个好的网格可能比程序员一周的薪水少很多,而且做得更多
  • 总的来说,我同意你的看法。但是,如果不是用于在列表项控件中显示数据的专用容器,那么 ObservableCollection 是什么?将其扩展为更专业的容器似乎是合乎逻辑的下一步。
  • 顺便说一句,我最初的问题仍未得到解答,即:扩展 ObservableCollection 的最简单方法是什么(即从哪里继承,要覆盖什么等)。如果我遗漏了我想要这样做的最终目的,那么可能有人已经回答了实际问题。很多时候,SO 和其他在线社区的开发人员实际上并没有回答人们的问题,而是选择通过告诉人们他们的问题是愚蠢、幼稚、业余等等来让自己看起来很聪明。
  • 这是不正确的。 List 控件可以绑定到any IEnumerable。当引发 CollectionChanged 或 PropertyChanged 事件时,无论源是什么,控件都会更新其显示。 ObservableCollection 只是一个为每个项目引发事件的集合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多