c# vb.net observablecollection inotifycollectionchanged addrange
我有一个ObservableCollection项目绑定到我的视图中的列表控件.
我有一种情况需要在集合的开头添加一大块值.
Collection<T>.Insertdocumentation将每个插入指定为O(n)操作,每个插入也生成一个CollectionChanged通知.
因此,我理想地希望在一次移动中插入整个范围的项目,这意味着只有一个基础列表的随机播放,并且希望有一个CollectionChanged通知(可能是"重置").
Collection<T>不公开任何执行此操作的方法.List<T>有InsertRange(),但是IList<T>,这Collection<T>暴露了通过其Items属性不会.
有没有办法做到这一点?
我有一个ObservableCollection,我想将IList的内容设置为这个.现在我可以创建一个新的集合实例..:
public ObservableCollection<Bar> obs = new ObservableCollection<Bar>();
public void Foo(IList<Bar> list)
{
obs = new ObservableCollection<Bar>(list);
}
Run Code Online (Sandbox Code Playgroud)
但是,我怎样才能真正获取IList的内容并将其添加到我现有的ObservableCollection中?我是否必须遍历所有元素,还是有更好的方法?
public void Foo(IList<Bar> list)
{
foreach (var elm in list)
obs.Add(elm);
}
Run Code Online (Sandbox Code Playgroud) 我想在Xamarin中添加验证.为此,我使用这篇文章作为参考点:使用Data Annotation进行验证.以下是我的行为.
public class EntryValidationBehavior : Behavior<Entry>
{
private Entry _associatedObject;
protected override void OnAttachedTo(Entry bindable)
{
base.OnAttachedTo(bindable);
// Perform setup
_associatedObject = bindable;
_associatedObject.TextChanged += _associatedObject_TextChanged;
}
void _associatedObject_TextChanged(object sender, TextChangedEventArgs e)
{
var source = _associatedObject.BindingContext as ValidationBase;
if (source != null && !string.IsNullOrEmpty(PropertyName))
{
var errors = source.GetErrors(PropertyName).Cast<string>();
if (errors != null && errors.Any())
{
var borderEffect = _associatedObject.Effects.FirstOrDefault(eff => eff is BorderEffect);
if (borderEffect == null)
{
_associatedObject.Effects.Add(new BorderEffect());
}
if (Device.OS != TargetPlatform.Windows) …Run Code Online (Sandbox Code Playgroud) 我有一个使用MVVM数据绑定的WPF应用程序.我正在为一个ObservableCollection<...>和其中很多人添加项目.
现在我想知道每次我在集合中添加一个,是否会立即触发事件并导致不必要的开销?如果是这样,我可以以某种方式暂时禁用事件通知并在我的代码结束时手动触发一次,这样如果我添加10k项,它只会被触发一次,而不是10k次?
更新:我尝试过这门课程:
using System;
using System.Linq;
using System.Collections.Specialized;
using System.Collections.Generic;
namespace MyProject
{
/// <summary>
/// Represents a dynamic data collection that provides notifications when items get added, removed, or when the whole list is refreshed.
/// </summary>
/// <typeparam name="T"></typeparam>
public class ObservableCollection<T> : System.Collections.ObjectModel.ObservableCollection<T>
{
/// <summary>
/// Adds the elements of the specified collection to the end of the ObservableCollection(Of T).
/// </summary>
public void AddRange(IEnumerable<T> collection)
{
foreach (var i in collection) Items.Add(i); …Run Code Online (Sandbox Code Playgroud) 目前我有两个模仿以下功能的WPF列表框
Word 2007自定义屏幕http://tlt.its.psu.edu/suggestions/international/graphics/vista/WordCustomize.gif
我正在使用2个ObservableCollections来允许用户选择他们需要的任何项目(灵活性是这里的关键).主要问题是我有两千个项目在两个列表框中分组.总而言之,设计工作非常好(有几十个项目),但我的绊脚石是用户在屏幕冻结时从左到右复制所有可用的项目(在不同的线程上运行的时间?).
看看ObservableCollection它没有AddRange方法,互联网上有各种各样的实现.我也知道CollectionChanged事件是不必要的被触发,因为每个项目都被严重复制在排水性能上.
很可能我不得不允许用户在将来从超过10,000个项目的组中进行选择,这听起来是个坏主意,但由于列表框(CollectionViewSource)上的分组工作得很好,但是不可协商,但是关闭两个列表框的虚拟化的副作用
在数据绑定到ObservableCollection时,如何在加载包含数千个项目的列表框时,如何提高性能?是否有推荐的AddRange类型实现?我在这里唯一的选择是在后台线程上运行它,这看起来很昂贵,因为我没有从数据库加载数据?
c# ×5
performance ×2
wpf ×2
addrange ×1
behavior ×1
collections ×1
data-binding ×1
insert ×1
list ×1
listbox ×1
mvvm ×1
vb.net ×1
xamarin ×1