【问题标题】:What methods should be override to make proper inheritance of `ObservableCollection`应该重写哪些方法以正确继承“ObservableCollection”
【发布时间】:2015-09-08 08:51:27
【问题描述】:

我想创建一个加入TableObservableCollection 功能的类。于是我写了:

public sealed class ObservableTable<T> : ObservableCollection<T>, ITable<T> where T : class
{
    private Table<T> _table;

    public Expression Expression => _table.AsQueryable().Expression;
    public Type ElementType => _table.AsQueryable().ElementType;
    public IQueryProvider Provider => _table.AsQueryable().Provider;

    public new IEnumerable<T> Items => _table;
    public new T this[int index] => _table.ElementAt(index);
    public new int Count => _table.Count();

    public ObservableTable(ref DataContext dbContext)
    {
        _table = dbContext.GetTable<T>();
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    } 

    public void InsertOnSubmit(T entity)
    {
        _table.InsertOnSubmit(entity);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add));
    }

    public void Attach(T entity)
    {
        _table.Attach(entity);
    }

    public void DeleteOnSubmit(T entity)
    {
        _table.DeleteOnSubmit(entity);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove));
    }
}

但是尽管_table 对象正确地从数据库中获取了所有记录,但当我将我的类转换为ObservableCollection 时,集合是空的。我应该覆盖什么才能让它工作? ItemsCount 属性还不够吗?

【问题讨论】:

    标签: c# .net oop inheritance observablecollection


    【解决方案1】:

    因为底层ObservableCollection&lt;T&gt; 为空。您正在重定向索引器和 ObservableTable&lt;T&gt; 的 Count 属性以从表中返回值,并且您通过 new 隐藏了原始属性实现,但实际的集合,ObservableCollection 使用的内部存储,永远不会被填充。

    如果您按原样使用ObservableTable&lt;T&gt;,一切正常。但只要将其转换为 ObservableCollection&lt;T&gt;,就会调用 indexer 和 count 属性的原始实现,它们会尝试从内部存储中检索值和计数。

    【讨论】:

    • 我想让ObservableTable 成为ItemsSourceListView。所以不可能吗?
    • 是的,你可以。实现 INotifyCollectionChanged 和 INotifyPropertyChanged,而不是从 ObservableCollection 继承。这足以让任何类参与 WPF 中(列表)控件的更新。谷歌搜索“INotifyCollectionChanged 示例”,您一定会找到一些实现示例。
    【解决方案2】:

    您没有覆盖属性,而是在您的类中“重新引入”它们并隐藏ObservableCollection&lt;T&gt; 的属性。检查the documentationthis question

    因此,如果您以((ObservableCollection&lt;T&gt;)instanceOfObservableTable).Count 的形式访问Count 属性,您实际上会获得基类的隐藏Count 属性,而不是您“重新引入”的属性。您只能这样访问您的资源:@​​987654327@。

    Count 属性不是虚拟的,因此您不能覆盖它。

    我建议你在你的类中同时实现INotifyCollectionChangedINotifyPropertyChanged 接口,这样你就可以将它用作一个可观察的集合。

    【讨论】:

    • 正如我在其他评论中所写,我想让ObservableTable 成为ItemsSourceListView。有没有可能这样做?
    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多