作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想做的是 FreezableCollection.AddRange(collectionToAdd)
每次我添加到 FreezableCollection 时都会引发一个事件并发生一些事情。现在我有一个我想添加的新集合,但这次我希望 FreezableCollection 的 CollectionChanged 事件 只触发一次。
循环并添加它们将为每个新项目引发事件。
有没有一种方法可以将所有目标都添加到 FreezableCollection,类似于 List.AddRange?
最佳答案
从集合派生并覆盖您想要更改的行为。我能够这样做:
public class PrestoObservableCollection<T> : ObservableCollection<T>
{
private bool _delayOnCollectionChangedNotification { get; set; }
/// <summary>
/// Add a range of IEnumerable items to the observable collection and optionally delay notification until the operation is complete.
/// </summary>
/// <param name="itemsToAdd"></param>
public void AddRange(IEnumerable<T> itemsToAdd)
{
if (itemsToAdd == null) throw new ArgumentNullException("itemsToAdd");
if (itemsToAdd.Any() == false) { return; } // Nothing to add.
_delayOnCollectionChangedNotification = true;
try
{
foreach (T item in itemsToAdd) { this.Add(item); }
}
finally
{
ResetNotificationAndFireChangedEvent();
}
}
/// <summary>
/// Clear the items in the ObservableCollection and optionally delay notification until the operation is complete.
/// </summary>
public void ClearItemsAndNotifyChangeOnlyWhenDone()
{
try
{
if (!this.Any()) { return; } // Nothing available to remove.
_delayOnCollectionChangedNotification = true;
this.Clear();
}
finally
{
ResetNotificationAndFireChangedEvent();
}
}
/// <summary>
/// Override the virtual OnCollectionChanged() method on the ObservableCollection class.
/// </summary>
/// <param name="e">Event arguments</param>
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (_delayOnCollectionChangedNotification) { return; }
base.OnCollectionChanged(e);
}
private void ResetNotificationAndFireChangedEvent()
{
// Turn delay notification off and call the OnCollectionChanged() method and tell it we had a change in the collection.
_delayOnCollectionChangedNotification = false;
this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
关于c# - 我想要做的是 FreezableCollection.AddRange(collectionToAdd),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9853064/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!