Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <Window
- x:Class="ObservableCollection.Window1"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="Window1"
- Height="300"
- Width="300"
- >
- <StackPanel>
- <Button x:Name="addButton" Content="Add" Width="100" Height="25" Margin="10" Click="addButton_Click"/>
- <Button x:Name="moveButton" Content="Move" Width="100" Height="25" Margin="10" Click="moveButton_Click"/>
- <Button x:Name="removeButton" Content="Remove" Width="100" Height="25" Margin="10" Click="removeButton_Click"/>
- <Button x:Name="replaceButton" Content="Replace" Width="100" Height="25" Margin="10" Click="replaceButton_Click"/>
- <Button x:Name="resetButton" Content="Reset" Width="100" Height="25" Margin="10" Click="resetButton_Click"/>
- </StackPanel>
- </Window>
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
- using System.Collections.ObjectModel;
- namespace ObservableCollection
- {
- /// <summary>
- /// Interaction logic for Window1.xaml
- /// </summary>
- public partial class Window1 : Window
- {
- public Window1()
- {
- InitializeComponent();
- _integerObservableCollection.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_integerObservableCollection_CollectionChanged);
- }
- private void _integerObservableCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
- {
- switch (e.Action)
- {
- case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
- break;
- case System.Collections.Specialized.NotifyCollectionChangedAction.Move:
- break;
- case System.Collections.Specialized.NotifyCollectionChangedAction.Remove:
- break;
- case System.Collections.Specialized.NotifyCollectionChangedAction.Replace:
- break;
- case System.Collections.Specialized.NotifyCollectionChangedAction.Reset:
- break;
- default:
- break;
- }
- }
- private void addButton_Click(object sender, RoutedEventArgs e)
- {
- _integerObservableCollection.Add(25);
- }
- private void moveButton_Click(object sender, RoutedEventArgs e)
- {
- _integerObservableCollection.Move(0, 19);
- }
- private void removeButton_Click(object sender, RoutedEventArgs e)
- {
- _integerObservableCollection.RemoveAt(0);
- }
- private void replaceButton_Click(object sender, RoutedEventArgs e)
- {
- _integerObservableCollection[0] = 50;
- }
- private void resetButton_Click(object sender, RoutedEventArgs e)
- {
- _integerObservableCollection.Clear();
- }
- private ObservableCollection<int> _integerObservableCollection = new ObservableCollection<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
- }
- }
- public static void RemoveAll(this IList list)
- {
- while (list.Count > 0)
- {
- list.RemoveAt(list.Count - 1);
- }
- }
- public class TrulyObservableCollection<T> : ObservableCollection<T>
- {
- public event EventHandler<EventArgs> Clearing;
- protected virtual void OnClearing(EventArgs e)
- {
- if (Clearing != null)
- Clearing(this, e);
- }
- protected override void ClearItems()
- {
- OnClearing(EventArgs.Empty);
- base.ClearItems();
- }
- }
- /// <summary>
- /// An observable collection with support for addrange and clear
- /// </summary>
- /// <typeparam name="T"></typeparam>
- [Serializable]
- [TypeConverter(typeof(ExpandableObjectConverter))]
- public class ObservableCollectionRange<T> : ObservableCollection<T>
- {
- private bool _addingRange;
- [field: NonSerialized]
- public event NotifyCollectionChangedEventHandler CollectionChangedRange;
- protected virtual void OnCollectionChangedRange(NotifyCollectionChangedEventArgs e)
- {
- if ((CollectionChangedRange == null) || _addingRange) return;
- using (BlockReentrancy())
- {
- CollectionChangedRange(this, e);
- }
- }
- public void AddRange(IEnumerable<T> collection)
- {
- CheckReentrancy();
- var newItems = new List<T>();
- if ((collection == null) || (Items == null)) return;
- using (var enumerator = collection.GetEnumerator())
- {
- while (enumerator.MoveNext())
- {
- _addingRange = true;
- Add(enumerator.Current);
- _addingRange = false;
- newItems.Add(enumerator.Current);
- }
- }
- OnCollectionChangedRange(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newItems));
- }
- protected override void ClearItems()
- {
- CheckReentrancy();
- var oldItems = new List<T>(this);
- base.ClearItems();
- OnCollectionChangedRange(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, oldItems));
- }
- protected override void InsertItem(int index, T item)
- {
- CheckReentrancy();
- base.InsertItem(index, item);
- OnCollectionChangedRange(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, index));
- }
- protected override void MoveItem(int oldIndex, int newIndex)
- {
- CheckReentrancy();
- var item = base[oldIndex];
- base.MoveItem(oldIndex, newIndex);
- OnCollectionChangedRange(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Move, item, newIndex, oldIndex));
- }
- protected override void RemoveItem(int index)
- {
- CheckReentrancy();
- var item = base[index];
- base.RemoveItem(index);
- OnCollectionChangedRange(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, index));
- }
- protected override void SetItem(int index, T item)
- {
- CheckReentrancy();
- var oldItem = base[index];
- base.SetItem(index, item);
- OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, oldItem, item, index));
- }
- }
- /// <summary>
- /// A read only observable collection with support for addrange and clear
- /// </summary>
- /// <typeparam name="T"></typeparam>
- [Serializable]
- [TypeConverter(typeof(ExpandableObjectConverter))]
- public class ReadOnlyObservableCollectionRange<T> : ReadOnlyObservableCollection<T>
- {
- [field: NonSerialized]
- public event NotifyCollectionChangedEventHandler CollectionChangedRange;
- public ReadOnlyObservableCollectionRange(ObservableCollectionRange<T> list) : base(list)
- {
- list.CollectionChangedRange += HandleCollectionChangedRange;
- }
- private void HandleCollectionChangedRange(object sender, NotifyCollectionChangedEventArgs e)
- {
- OnCollectionChangedRange(e);
- }
- protected virtual void OnCollectionChangedRange(NotifyCollectionChangedEventArgs args)
- {
- if (CollectionChangedRange != null)
- {
- CollectionChangedRange(this, args);
- }
- }
- }
- protected override void ClearItems()
- {
- CheckReentrancy();
- List<TItem> oldItems = new List<TItem>(Items);
- Items.Clear();
- OnPropertyChanged(new PropertyChangedEventArgs("Count"));
- OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
- NotifyCollectionChangedEventArgs e =
- new NotifyCollectionChangedEventArgs
- (
- NotifyCollectionChangedAction.Reset
- );
- FieldInfo field =
- e.GetType().GetField
- (
- "_oldItems",
- BindingFlags.Instance | BindingFlags.NonPublic
- );
- field.SetValue(e, oldItems);
- OnCollectionChanged(e);
- }
- using System;
- using System.Collections.Generic;
- /// <summary>
- /// Notifies listeners of the following situations:
- /// <list type="bullet">
- /// <item>Elements have been added.</item>
- /// <item>Elements are about to be removed.</item>
- /// </list>
- /// </summary>
- /// <typeparam name="T">The type of elements in the collection.</typeparam>
- interface INotifyCollection<T>
- {
- /// <summary>
- /// Occurs when elements have been added.
- /// </summary>
- event EventHandler<NotifyCollectionEventArgs<T>> Added;
- /// <summary>
- /// Occurs when elements are about to be removed.
- /// </summary>
- event EventHandler<NotifyCollectionEventArgs<T>> Removing;
- }
- /// <summary>
- /// Provides data for the NotifyCollection event.
- /// </summary>
- /// <typeparam name="T">The type of elements in the collection.</typeparam>
- public class NotifyCollectionEventArgs<T> : EventArgs
- {
- /// <summary>
- /// Gets or sets the elements.
- /// </summary>
- /// <value>The elements.</value>
- public IEnumerable<T> Items
- {
- get;
- set;
- }
- }
- /// <summary>
- /// An observable collection that cannot be reset. When clear is called
- /// items are removed individually, giving listeners the chance to detect
- /// each remove event and perform operations such as unhooking event
- /// handlers.
- /// </summary>
- /// <typeparam name="T">The type of item in the collection.</typeparam>
- public class NoResetObservableCollection<T> : ObservableCollection<T>
- {
- public NoResetObservableCollection()
- {
- }
- /// <summary>
- /// Clears all items in the collection by removing them individually.
- /// </summary>
- protected override void ClearItems()
- {
- IList<T> items = new List<T>(this);
- foreach (T item in items)
- {
- Remove(item);
- }
- }
- }
- /// <summary>
- /// Helper class that allows to "detach" all current Eventhandlers by setting
- /// DelegateHandler to null.
- /// </summary>
- public class PropertyChangedDelegator
- {
- /// <summary>
- /// Callback to the real event handling code.
- /// </summary>
- public PropertyChangedEventHandler DelegateHandler;
- /// <summary>
- /// Eventhandler that is registered by the elements.
- /// </summary>
- /// <param name="sender">the element that has been changed.</param>
- /// <param name="e">the event arguments</param>
- public void PropertyChangedHandler(Object sender, PropertyChangedEventArgs e)
- {
- if (DelegateHandler != null)
- {
- DelegateHandler(sender, e);
- }
- else
- {
- INotifyPropertyChanged s = sender as INotifyPropertyChanged;
- if (s != null)
- s.PropertyChanged -= PropertyChangedHandler;
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Collections.Specialized;
- using System.Reflection;
- namespace WpfUtil.Collections
- {
- public static class ObservableCollectionExtension
- {
- public static void RemoveAllOneByOne<T>(this ObservableCollection<T> obsColl)
- {
- foreach (T item in obsColl)
- {
- while (obsColl.Count > 0)
- {
- obsColl.RemoveAt(0);
- }
- }
- }
- public static void RemoveAll<T>(this ObservableCollection<T> obsColl)
- {
- if (obsColl.Count > 0)
- {
- List<T> removedItems = new List<T>(obsColl);
- obsColl.Clear();
- NotifyCollectionChangedEventArgs e =
- new NotifyCollectionChangedEventArgs
- (
- NotifyCollectionChangedAction.Remove,
- removedItems
- );
- var eventInfo =
- obsColl.GetType().GetField
- (
- "CollectionChanged",
- BindingFlags.Instance | BindingFlags.NonPublic
- );
- if (eventInfo != null)
- {
- var eventMember = eventInfo.GetValue(obsColl);
- // note: if eventMember is null
- // nobody registered to the event, you can't call it.
- if (eventMember != null)
- eventMember.GetType().GetMethod("Invoke").
- Invoke(eventMember, new object[] { obsColl, e });
- }
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment