有一堆ObservableCollection<MeClass> Result
并需要将它们全部组合成另一个ObservableCollection<MeClass> AllResults
,以便我可以将其显示在listview
.
只是不知道如何将它们组合在一起。
我创建了一个新类来组合它们,但不确定在获得列表后它们将如何更新......所以不太确定要采取哪个方向。
我知道INotifyPropertyChanged
我只是不确定如何将它们结合起来并随着一切的变化而不断更新。
有一堆ObservableCollection<MeClass> Result
并需要将它们全部组合成另一个ObservableCollection<MeClass> AllResults
,以便我可以将其显示在listview
.
只是不知道如何将它们组合在一起。
我创建了一个新类来组合它们,但不确定在获得列表后它们将如何更新......所以不太确定要采取哪个方向。
我知道INotifyPropertyChanged
我只是不确定如何将它们结合起来并随着一切的变化而不断更新。
.NETCompositeCollection
允许您将多个集合视为一个集合。它实现INotifyCollectionChanged
了 ,因此只要您的内部集合也实现INotifyCollectionChanged
了(在您的情况下确实如此),您的绑定应该可以正常工作。
使用示例:
CompositeCollection cc = new CompositeCollection();
CollectionContainer container1 = new CollectionContainer() { Collection = Result1 }
CollectionContainer container2 = new CollectionContainer() { Collection = Result2 }
cc.Add(container1);
cc.Add(container2);
像这样的东西?
public class CompositeCollection : ObservableCollection<MeClass>
{
private ObservableCollection<MeClass> _subCollection1;
private ObservableCollection<MeClass> _subCollection2;
public CompositeCollection(ObservableCollection<MeClass> subCollection1, ObservableCollection<MeClass> subCollection2)
{
_subCollection1 = subCollection1;
_subCollection2 = subCollection2;
AddSubCollections();
SubscribeToSubCollectionChanges();
}
private void AddSubCollections()
{
AddItems(_subCollection1.All);
AddItems(_subCollection2.All);
}
private void AddItems(IEnumerable<MeClass> items)
{
foreach (MeClass me in items)
Add(me);
}
private void RemoveItems(IEnumerable<MeClass> items)
{
foreach (MeClass me in items)
Remove(me);
}
private void SubscribeToSubCollectionChanges()
{
_subCollection1.CollectionChanged += OnSubCollectionChanged;
_subCollection2.CollectionChanged += OnSubCollectionChanged;
}
private void OnSubCollectionChanged(object source, NotifyCollectionChangedEventArgs args)
{
switch(args.Action)
{
case NotifyCollectionChangedAction.Add: AddItems(args.NewItems.Cast<MeClass>());
break;
case NotifyCollectionChangedAction.Remove: RemoveItems(args.OldItems.Cast<MeClass>());
break;
case NotifyCollectionChangedAction.Reset: Clear();
AddSubCollections();
break;
}
}
}
我将@GazTheDestroyer 的答案改写成这个(需要 C# 7):
internal sealed class CompositeObservableCollection<T> : ObservableCollection<T>
{
public CompositeObservableCollection(INotifyCollectionChanged subCollection1, INotifyCollectionChanged subCollection2)
{
AddItems((IEnumerable<T>)subCollection1);
AddItems((IEnumerable<T>)subCollection2);
subCollection1.CollectionChanged += OnSubCollectionChanged;
subCollection2.CollectionChanged += OnSubCollectionChanged;
void OnSubCollectionChanged(object source, NotifyCollectionChangedEventArgs args)
{
switch (args.Action)
{
case NotifyCollectionChangedAction.Add:
AddItems(args.NewItems.Cast<T>());
break;
case NotifyCollectionChangedAction.Remove:
RemoveItems(args.OldItems.Cast<T>());
break;
case NotifyCollectionChangedAction.Reset:
Clear();
AddItems((IEnumerable<T>)subCollection1);
AddItems((IEnumerable<T>)subCollection2);
break;
case NotifyCollectionChangedAction.Replace:
RemoveItems(args.OldItems.Cast<T>());
AddItems(args.NewItems.Cast<T>());
break;
case NotifyCollectionChangedAction.Move:
throw new NotImplementedException();
default:
throw new ArgumentOutOfRangeException();
}
}
void AddItems(IEnumerable<T> items)
{
foreach (var me in items)
Add(me);
}
void RemoveItems(IEnumerable<T> items)
{
foreach (var me in items)
Remove(me);
}
}
}