将dependencyProperty添加到Collection?

时间:2011-03-24 10:41:44

标签: wpf inheritance dependency-properties

我有一个继承基类Collection类的类(dataGridRow的ViewModel)

现在,我想在此类中添加DependencyProperty,以便我可以轻松地绑定到它。问题是:Collection不是DependencyObject所以我不能使用GetValue()SetValue()方法,而C#不进行多重继承,因此我可以继承{{1} }以及Collection

有一个简单的解决方案吗?

或者我别无选择,只能使用简单的DependencyObject,继承Property并实施INotifyPropertyChanged

3 个答案:

答案 0 :(得分:2)

恕我直言ViewModel 永远不会实现DependencyObject,而是实现INotifyPropertyChanged(INPC)。

DataBinding to Dependency Properties确实比绑定到INPC更快,因为不涉及反射,但除非你处理数据的sh * tload,否则这不会是一个问题。

实现DependencyObject严格用于UI元素,而不是其他任何东西,DP附带的基础结构不仅仅是更改通知。根据定义,ViewModel类不是面向UI的,因此继承DependencyObject是一种设计气味。

答案 1 :(得分:0)

使用聚合而不是多重继承:

class MyCollection<T> : DependencyObject, ICollection<T>
{
    // Inner collection for call redirections. 
    private Collection<T> _collection; 

    #region ICollection<T> Members

    public void Add(T item)
    {
        this._collection.Add(item);
    }

    public void Clear()
    {
        this._collection.Add(clear);
    }

    // Other ICollection methods ... 
    #endregion

    #region MyProperty Dependency Property

    public int MyProperty
    {
        get
        {
            return (int)this.GetValue(MyCollection<T>.MyPropertyProperty);
        }
        set
        {
            this.SetValue(MyCollection<T>.MyPropertyProperty, value);
        }
    }

    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.Register("MyProperty",
            typeof(int),
            typeof(MyCollection<T>),
            new FrameworkPropertyMetadata(0));

    #endregion
}

答案 2 :(得分:0)

只是为了结束这个问题,我会满足于:“不,这是不可能的。”

亚历克斯的答案提供了一个有趣的视角,但就我而言,正如我的评论所述,这不会使任何事情变得更容易或更具可读性。

最后,我实施了INPC