Согласно http://blog.dygraphs.com/2012/03/javascript-and-dates-what-mess.html формат «yyyy / mm / dd» решает обычные проблемы , Он говорит: «Придерживайтесь« YYYY / MM / DD »для строк даты, когда это возможно. Это универсально поддерживается и недвусмысленно. В этом формате все времена являются локальными». Я установил тесты: http://jsfiddle.net/jlanus/ND2Qg/432/ Этот формат: + избегает двусмысленности порядка дня и месяца, используя порядок ymd и 4-значный год + избегает UTC против локальной проблемы, не соответствующей формату ISO, с помощью косой черты + danvk, dygraphs , говорит, что этот формат хорош во всех браузерах.
Дополнительный Человек Метода к спасению!
/// <summary>
/// Adds all given items to the collection
/// </summary>
/// <param name="collection">The collection.</param>
/// <param name="toAdd">Objects to add.</param>
public static void AddAll<T>(this IList<T> collection, params T[] toAdd)
{
foreach (var o in toAdd)
collection.Add(o);
}
Кажется, что эти INotifyCollectionChanged
интерфейс допускает обновление, когда несколько объектов были добавлены, таким образом, я не уверен, почему ObservableCollection<T>
не имеет AddRange
. Вы могли сделать дополнительный метод для AddRange
, но это вызовет событие для каждого объекта, который добавляется. Если это не приемлемо, необходимо быть в состоянии наследоваться от ObservableCollection<T>
следующим образом:
public class MyObservableCollection<T> : ObservableCollection<T>
{
// matching constructors ...
bool isInAddRange = false;
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
// intercept this when it gets called inside the AddRange method.
if (!isInAddRange)
base.OnCollectionChanged(e);
}
public void AddRange(IEnumerable<T> items)
{
isInAddRange = true;
foreach (T item in items)
Add(item);
isInAddRange = false;
var e = new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add,
items.ToList());
base.OnCollectionChanged(e);
}
}
Хорошо идея - то же как тот из fryguybob - довольно странный, что ObservableCollection отчасти полусделан. Событие args для этой вещи даже не использует Дженериков.. создание меня использовать IList (это так.. вчера:) Протестированный Отрывок следует...
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
namespace MyNamespace
{
public class ObservableCollectionWithBatchUpdates<T> : ObservableCollection<T>
{
public void AddRange(ICollection<T> obNewItems)
{
IList<T> obAddedItems = new List<T>();
foreach (T obItem in obNewItems)
{
Items.Add(obItem);
obAddedItems.Add(obItem);
}
NotifyCollectionChangedEventArgs obEvtArgs = new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add,
obAddedItems as System.Collections.IList);
base.OnCollectionChanged(obEvtArgs);
}
}
}
Мало того, что System.Collections.ObjectModel.Collection<T>
хорошая ставка, но и в документах справки, существует пример из как переопределить его различные защищенные методы для получения уведомления. (Прокрутите вниз к Примеру 2.)
Если Вы желаете наследоваться какому-то набору, Вы - вероятно, более обеспеченное наследование от Системы. Наборы. ObjectModel. Набор, потому что это предоставляет виртуальные методы для переопределения. Вы будете иметь к теневым методам прочь Списка, если Вы пойдете тем путем.
я не знаю ни о каких встроенных наборах, которые обеспечивают эту функциональность, хотя я приветствовал бы быть исправленным:)
Наследуйтесь List< T> и переопределение Добавление () и AddRange () методы, чтобы сгенерировать событие?
Если вы используете любую из вышеперечисленных реализаций, которые отправляют команду добавления диапазона и связывают наблюдаемую коллекцию со списком, вы получите эту неприятную ошибку.
NotSupportedException at System.Windows.Data.ListCollectionView.ValidateCollectionChangedEventArgs(NotifyCollectionChangedEventArgs e) at System.Windows.Data.ListCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args) at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e) at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
Реализация, которую я использовал, использует событие Reset, которое более равномерно реализовано во фреймворке WPF:
public void AddRange(IEnumerable<T> collection)
{
foreach (var i in collection) Items.Add(i);
OnPropertyChanged("Count");
OnPropertyChanged("Item[]");
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
Взгляните на коллекцию Observable с методами диапазона AddRange, RemoveRange и Replace в C # и VB.
В VB: реализация INotifyCollectionChanging.
Для быстрого добавления вы можете использовать:
((List<Person>)this.Items).AddRange(NewItems);