为ItemsSource项创建额外的表示属性

时间:2013-10-21 21:28:12

标签: c# wpf mvvm observablecollection inotifypropertychanged

我有一个ObservableCollection项目绑定到列表框作为ItemsSource。

其中一些项目也位于同一ViewModel上的另一个集合中(称之为CollectionTwo)。

我希望能够获取Collection2中项目的计数,并将其显示在CollectionOne中的相应项目中。当CollectionTwo属性发生变化(即Count)时,它也必须反映回CollectionOne。

我猜想在MVVM中执行此操作的最佳方法是使用viewmodel类在CollectionOne中包装项目,并在其上添加额外的Count属性。有人能指出我这方面的一个很好的例子吗?或者也许是解决这个问题的另一种方法,它不会严重影响我的ItemsSource性能。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用继承沿这些行创建自定义集合...

public class MyCollection<T> : ObservableCollection<T>, INotifyPropertyChanged
{
    // implementation goes here...
    //
    private int _myCount;
    public int MyCount
    {
        [DebuggerStepThrough]
        get { return _myCount; }
        [DebuggerStepThrough]
        set
        {
            if (value != _myCount)
            {
                _myCount = value;
                OnPropertyChanged("MyCount");
            }
        }
    }
    #region INotifyPropertyChanged Implementation
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string name)
    {
        var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
    #endregion
}

这是一个包装Observable Collection并在其中放置自定义属性的类。酒店参与变更通知,但这取决于您的设计。

要连线,你可以做这样的事情......

    public MyCollection<string> Collection1 { get; set; }
    public MyCollection<string> Collection2 { get; set; } 
    public void Initialise()
    {
        Collection1 = new MyCollection<string> { MyCount = 0 };
        Collection2 = new MyCollection<string> { MyCount = 0 };
        Collection2.CollectionChanged += (s, a) =>
            {
                // do something here
            };
    }

你也可以做点什么......

Collection1.PropertyChanged += // your delegate goes here