我有一个ObservableCollection项目绑定到列表框作为ItemsSource。
其中一些项目也位于同一ViewModel上的另一个集合中(称之为CollectionTwo)。
我希望能够获取Collection2中项目的计数,并将其显示在CollectionOne中的相应项目中。当CollectionTwo属性发生变化(即Count)时,它也必须反映回CollectionOne。
我猜想在MVVM中执行此操作的最佳方法是使用viewmodel类在CollectionOne中包装项目,并在其上添加额外的Count属性。有人能指出我这方面的一个很好的例子吗?或者也许是解决这个问题的另一种方法,它不会严重影响我的ItemsSource性能。
谢谢!
答案 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