ObservableCollection
から継承し、AddRange
やRemoveRange
などのいくつかのメソッドを追加するクラスがあります。
私の基本メソッド呼び出しはこれです:
public void AddRange(IEnumerable<T> collection)
{
foreach (var i in collection) Items.Add(i);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
これに関する私の問題は、CollectionChanged
イベントのe.NewItems
またはe.OldItems
にアクセスして、コレクション内のアイテムに対してアクションを実行し、NotifyCollectionChangedAction.Reset
アクションを実行することです。これらの値を渡さない
void Instances_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null) // e.NewItems is always null
{
foreach (var item in e.NewItems)
{
if (item is EventInstanceModel)
((EventInstanceModel)item).ParentEvent = this;
}
}
}
したがって、Reset
の代わりにNotifyCollectionChangedAction.Add
を使用することもできると思いましたが、Range actions are not supported
例外がスローされます
public void AddRange(IEnumerable<T> collection)
{
var addedItems = collection.ToList();
foreach (var i in addedItems) Items.Add(i);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, addedItems));
}
だから私の質問は、CollectionChangedイベントを発生させ、それに新しいまたは古い項目リストを渡すにはどうすればよいですか?
私はそれを調査しており、どうやらCollectionChanged
メソッドは複数のアイテムで発生させることはできません。
だから私は呼び出すことができます
OnCollectionChanged(new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add, singleItem));
でも電話はできない
OnCollectionChanged(new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add, listOfItems));
今のところ、追加したすべてのアイテムに対してAddイベントを発生させるだけですが、CollectionChanged
メソッド内のすべてのアイテムに対してAddRange
イベントを発生させることになるので、まだ不満があります。一度だけではなく。
public void AddRange(IEnumerable<T> collection)
{
foreach (var i in collection)
{
Items.Add(i);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add, i));
}
}
これは、「スタンドアロン」でうまく機能します。データバインディングにObservableCollection
を使用していないことを意味します。したがって、これはObservableCollection
の問題ではなく、ListCollectionView
の制限です。
次の記事をお読みください。非常に興味深い記事です。