0

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

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

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

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

谢谢!

4

1 回答 1

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
于 2013-10-21T22:28:02.050 回答