up
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0340683ab418d46789fd29788f193fc6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,263 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.ComponentModel;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections;
|
||||
|
||||
#if NETFX_CORE
|
||||
using specialized = System.Collections.Specialized;
|
||||
#else
|
||||
using specialized = PlatformSupport.Collections.Specialized;
|
||||
#endif
|
||||
|
||||
namespace PlatformSupport.Collections.ObjectModel
|
||||
{
|
||||
public class ObservableDictionary<TKey, TValue> : IDictionary<TKey, TValue>, specialized.INotifyCollectionChanged, INotifyPropertyChanged
|
||||
{
|
||||
private const string CountString = "Count";
|
||||
private const string IndexerName = "Item[]";
|
||||
private const string KeysName = "Keys";
|
||||
private const string ValuesName = "Values";
|
||||
|
||||
private IDictionary<TKey, TValue> _Dictionary;
|
||||
protected IDictionary<TKey, TValue> Dictionary
|
||||
{
|
||||
get { return _Dictionary; }
|
||||
}
|
||||
|
||||
#region Constructors
|
||||
public ObservableDictionary()
|
||||
{
|
||||
_Dictionary = new Dictionary<TKey, TValue>();
|
||||
}
|
||||
public ObservableDictionary(IDictionary<TKey, TValue> dictionary)
|
||||
{
|
||||
_Dictionary = new Dictionary<TKey, TValue>(dictionary);
|
||||
}
|
||||
public ObservableDictionary(IEqualityComparer<TKey> comparer)
|
||||
{
|
||||
_Dictionary = new Dictionary<TKey, TValue>(comparer);
|
||||
}
|
||||
public ObservableDictionary(int capacity)
|
||||
{
|
||||
_Dictionary = new Dictionary<TKey, TValue>(capacity);
|
||||
}
|
||||
public ObservableDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer)
|
||||
{
|
||||
_Dictionary = new Dictionary<TKey, TValue>(dictionary, comparer);
|
||||
}
|
||||
public ObservableDictionary(int capacity, IEqualityComparer<TKey> comparer)
|
||||
{
|
||||
_Dictionary = new Dictionary<TKey, TValue>(capacity, comparer);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region IDictionary<TKey,TValue> Members
|
||||
|
||||
public void Add(TKey key, TValue value)
|
||||
{
|
||||
Insert(key, value, true);
|
||||
}
|
||||
|
||||
public bool ContainsKey(TKey key)
|
||||
{
|
||||
return Dictionary.ContainsKey(key);
|
||||
}
|
||||
|
||||
public ICollection<TKey> Keys
|
||||
{
|
||||
get { return Dictionary.Keys; }
|
||||
}
|
||||
|
||||
public bool Remove(TKey key)
|
||||
{
|
||||
if (key == null) throw new ArgumentNullException("key");
|
||||
|
||||
TValue value;
|
||||
Dictionary.TryGetValue(key, out value);
|
||||
var removed = Dictionary.Remove(key);
|
||||
if (removed)
|
||||
|
||||
//OnCollectionChanged(NotifyCollectionChangedAction.Remove, new KeyValuePair<TKey, TValue>(key, value));
|
||||
OnCollectionChanged();
|
||||
|
||||
|
||||
return removed;
|
||||
}
|
||||
|
||||
public bool TryGetValue(TKey key, out TValue value)
|
||||
{
|
||||
return Dictionary.TryGetValue(key, out value);
|
||||
}
|
||||
|
||||
public ICollection<TValue> Values
|
||||
{
|
||||
get { return Dictionary.Values; }
|
||||
}
|
||||
|
||||
public TValue this[TKey key]
|
||||
{
|
||||
get
|
||||
{
|
||||
return Dictionary[key];
|
||||
}
|
||||
set
|
||||
{
|
||||
Insert(key, value, false);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ICollection<KeyValuePair<TKey,TValue>> Members
|
||||
|
||||
public void Add(KeyValuePair<TKey, TValue> item)
|
||||
{
|
||||
Insert(item.Key, item.Value, true);
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
if (Dictionary.Count > 0)
|
||||
{
|
||||
Dictionary.Clear();
|
||||
OnCollectionChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public bool Contains(KeyValuePair<TKey, TValue> item)
|
||||
{
|
||||
return Dictionary.Contains(item);
|
||||
}
|
||||
|
||||
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
|
||||
{
|
||||
Dictionary.CopyTo(array, arrayIndex);
|
||||
}
|
||||
|
||||
public int Count
|
||||
{
|
||||
get { return Dictionary.Count; }
|
||||
}
|
||||
|
||||
public bool IsReadOnly
|
||||
{
|
||||
get { return Dictionary.IsReadOnly; }
|
||||
}
|
||||
|
||||
public bool Remove(KeyValuePair<TKey, TValue> item)
|
||||
{
|
||||
return Remove(item.Key);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEnumerable<KeyValuePair<TKey,TValue>> Members
|
||||
|
||||
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
|
||||
{
|
||||
return Dictionary.GetEnumerator();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEnumerable Members
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
return ((IEnumerable)Dictionary).GetEnumerator();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region INotifyCollectionChanged Members
|
||||
|
||||
public event specialized.NotifyCollectionChangedEventHandler CollectionChanged;
|
||||
|
||||
#endregion
|
||||
|
||||
#region INotifyPropertyChanged Members
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
#endregion
|
||||
|
||||
public void AddRange(IDictionary<TKey, TValue> items)
|
||||
{
|
||||
if (items == null) throw new ArgumentNullException("items");
|
||||
|
||||
if (items.Count > 0)
|
||||
{
|
||||
if (Dictionary.Count > 0)
|
||||
{
|
||||
if (items.Keys.Any((k) => Dictionary.ContainsKey(k)))
|
||||
throw new ArgumentException("An item with the same key has already been added.");
|
||||
else
|
||||
foreach (var item in items) Dictionary.Add(item);
|
||||
}
|
||||
else
|
||||
_Dictionary = new Dictionary<TKey, TValue>(items);
|
||||
|
||||
OnCollectionChanged(specialized.NotifyCollectionChangedAction.Add, items.ToArray());
|
||||
}
|
||||
}
|
||||
|
||||
private void Insert(TKey key, TValue value, bool add)
|
||||
{
|
||||
if (key == null) throw new ArgumentNullException("key");
|
||||
|
||||
TValue item;
|
||||
if (Dictionary.TryGetValue(key, out item))
|
||||
{
|
||||
if (add) throw new ArgumentException("An item with the same key has already been added.");
|
||||
if (Equals(item, value)) return;
|
||||
Dictionary[key] = value;
|
||||
|
||||
OnCollectionChanged(specialized.NotifyCollectionChangedAction.Replace, new KeyValuePair<TKey, TValue>(key, value), new KeyValuePair<TKey, TValue>(key, item));
|
||||
}
|
||||
else
|
||||
{
|
||||
Dictionary[key] = value;
|
||||
|
||||
OnCollectionChanged(specialized.NotifyCollectionChangedAction.Add, new KeyValuePair<TKey, TValue>(key, value));
|
||||
}
|
||||
}
|
||||
|
||||
private void OnPropertyChanged()
|
||||
{
|
||||
OnPropertyChanged(CountString);
|
||||
OnPropertyChanged(IndexerName);
|
||||
OnPropertyChanged(KeysName);
|
||||
OnPropertyChanged(ValuesName);
|
||||
}
|
||||
|
||||
protected virtual void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
|
||||
private void OnCollectionChanged()
|
||||
{
|
||||
OnPropertyChanged();
|
||||
if (CollectionChanged != null) CollectionChanged(this, new specialized.NotifyCollectionChangedEventArgs(specialized.NotifyCollectionChangedAction.Reset));
|
||||
}
|
||||
|
||||
private void OnCollectionChanged(specialized.NotifyCollectionChangedAction action, KeyValuePair<TKey, TValue> changedItem)
|
||||
{
|
||||
OnPropertyChanged();
|
||||
if (CollectionChanged != null) CollectionChanged(this, new specialized.NotifyCollectionChangedEventArgs(action, changedItem));
|
||||
}
|
||||
|
||||
private void OnCollectionChanged(specialized.NotifyCollectionChangedAction action, KeyValuePair<TKey, TValue> newItem, KeyValuePair<TKey, TValue> oldItem)
|
||||
{
|
||||
OnPropertyChanged();
|
||||
if (CollectionChanged != null) CollectionChanged(this, new specialized.NotifyCollectionChangedEventArgs(action, newItem, oldItem));
|
||||
}
|
||||
|
||||
private void OnCollectionChanged(specialized.NotifyCollectionChangedAction action, IList newItems)
|
||||
{
|
||||
OnPropertyChanged();
|
||||
if (CollectionChanged != null) CollectionChanged(this, new specialized.NotifyCollectionChangedEventArgs(action, newItems));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3de08bc9233e94e0f9864fcc8d05a1e3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 58fbbb653fb8d40a5bb47d4c657a3d86
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,467 @@
|
||||
#if !NETFX_CORE
|
||||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace PlatformSupport.Collections.Specialized
|
||||
{
|
||||
public delegate void NotifyCollectionChangedEventHandler(object sender, PlatformSupport.Collections.Specialized.NotifyCollectionChangedEventArgs e);
|
||||
|
||||
public interface INotifyCollectionChanged
|
||||
{
|
||||
event NotifyCollectionChangedEventHandler CollectionChanged;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This enum describes the action that caused a CollectionChanged event.
|
||||
/// </summary>
|
||||
public enum NotifyCollectionChangedAction
|
||||
{
|
||||
/// <summary> One or more items were added to the collection. </summary>
|
||||
Add,
|
||||
/// <summary> One or more items were removed from the collection. </summary>
|
||||
Remove,
|
||||
/// <summary> One or more items were replaced in the collection. </summary>
|
||||
Replace,
|
||||
/// <summary> One or more items were moved within the collection. </summary>
|
||||
Move,
|
||||
/// <summary> The contents of the collection changed dramatically. </summary>
|
||||
Reset,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Arguments for the CollectionChanged event.
|
||||
/// A collection that supports INotifyCollectionChangedThis raises this event
|
||||
/// whenever an item is added or removed, or when the contents of the collection
|
||||
/// changes dramatically.
|
||||
/// </summary>
|
||||
public class NotifyCollectionChangedEventArgs : EventArgs
|
||||
{
|
||||
//------------------------------------------------------
|
||||
//
|
||||
// Constructors
|
||||
//
|
||||
//------------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// Construct a NotifyCollectionChangedEventArgs that describes a reset change.
|
||||
/// </summary>
|
||||
/// <param name="action">The action that caused the event (must be Reset).</param>
|
||||
public NotifyCollectionChangedEventArgs(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action)
|
||||
{
|
||||
if (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Reset)
|
||||
throw new ArgumentException("action");
|
||||
|
||||
InitializeAdd(action, null, -1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Construct a NotifyCollectionChangedEventArgs that describes a one-item change.
|
||||
/// </summary>
|
||||
/// <param name="action">The action that caused the event; can only be Reset, Add or Remove action.</param>
|
||||
/// <param name="changedItem">The item affected by the change.</param>
|
||||
public NotifyCollectionChangedEventArgs(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, object changedItem)
|
||||
{
|
||||
if ((action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Add) && (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Remove)
|
||||
&& (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Reset))
|
||||
throw new ArgumentException("action");
|
||||
|
||||
if (action == PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Reset)
|
||||
{
|
||||
if (changedItem != null)
|
||||
throw new ArgumentException("action");
|
||||
|
||||
InitializeAdd(action, null, -1);
|
||||
}
|
||||
else
|
||||
{
|
||||
InitializeAddOrRemove(action, new object[] { changedItem }, -1);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Construct a NotifyCollectionChangedEventArgs that describes a one-item change.
|
||||
/// </summary>
|
||||
/// <param name="action">The action that caused the event.</param>
|
||||
/// <param name="changedItem">The item affected by the change.</param>
|
||||
/// <param name="index">The index where the change occurred.</param>
|
||||
public NotifyCollectionChangedEventArgs(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, object changedItem, int index)
|
||||
{
|
||||
if ((action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Add) && (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Remove)
|
||||
&& (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Reset))
|
||||
throw new ArgumentException("action");
|
||||
|
||||
if (action == PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Reset)
|
||||
{
|
||||
if (changedItem != null)
|
||||
throw new ArgumentException("action");
|
||||
if (index != -1)
|
||||
throw new ArgumentException("action");
|
||||
|
||||
InitializeAdd(action, null, -1);
|
||||
}
|
||||
else
|
||||
{
|
||||
InitializeAddOrRemove(action, new object[] { changedItem }, index);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Construct a NotifyCollectionChangedEventArgs that describes a multi-item change.
|
||||
/// </summary>
|
||||
/// <param name="action">The action that caused the event.</param>
|
||||
/// <param name="changedItems">The items affected by the change.</param>
|
||||
public NotifyCollectionChangedEventArgs(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, IList changedItems)
|
||||
{
|
||||
if ((action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Add) && (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Remove)
|
||||
&& (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Reset))
|
||||
throw new ArgumentException("action");
|
||||
|
||||
if (action == PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Reset)
|
||||
{
|
||||
if (changedItems != null)
|
||||
throw new ArgumentException("action");
|
||||
|
||||
InitializeAdd(action, null, -1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (changedItems == null)
|
||||
throw new ArgumentNullException("changedItems");
|
||||
|
||||
InitializeAddOrRemove(action, changedItems, -1);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Construct a NotifyCollectionChangedEventArgs that describes a multi-item change (or a reset).
|
||||
/// </summary>
|
||||
/// <param name="action">The action that caused the event.</param>
|
||||
/// <param name="changedItems">The items affected by the change.</param>
|
||||
/// <param name="startingIndex">The index where the change occurred.</param>
|
||||
public NotifyCollectionChangedEventArgs(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, IList changedItems, int startingIndex)
|
||||
{
|
||||
if ((action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Add) && (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Remove)
|
||||
&& (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Reset))
|
||||
throw new ArgumentException("action");
|
||||
|
||||
if (action == PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Reset)
|
||||
{
|
||||
if (changedItems != null)
|
||||
throw new ArgumentException("action");
|
||||
if (startingIndex != -1)
|
||||
throw new ArgumentException("action");
|
||||
|
||||
InitializeAdd(action, null, -1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (changedItems == null)
|
||||
throw new ArgumentNullException("changedItems");
|
||||
if (startingIndex < -1)
|
||||
throw new ArgumentException("startingIndex");
|
||||
|
||||
InitializeAddOrRemove(action, changedItems, startingIndex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Construct a NotifyCollectionChangedEventArgs that describes a one-item Replace event.
|
||||
/// </summary>
|
||||
/// <param name="action">Can only be a Replace action.</param>
|
||||
/// <param name="newItem">The new item replacing the original item.</param>
|
||||
/// <param name="oldItem">The original item that is replaced.</param>
|
||||
public NotifyCollectionChangedEventArgs(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, object newItem, object oldItem)
|
||||
{
|
||||
if (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Replace)
|
||||
throw new ArgumentException("action");
|
||||
|
||||
InitializeMoveOrReplace(action, new object[] { newItem }, new object[] { oldItem }, -1, -1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Construct a NotifyCollectionChangedEventArgs that describes a one-item Replace event.
|
||||
/// </summary>
|
||||
/// <param name="action">Can only be a Replace action.</param>
|
||||
/// <param name="newItem">The new item replacing the original item.</param>
|
||||
/// <param name="oldItem">The original item that is replaced.</param>
|
||||
/// <param name="index">The index of the item being replaced.</param>
|
||||
public NotifyCollectionChangedEventArgs(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, object newItem, object oldItem, int index)
|
||||
{
|
||||
if (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Replace)
|
||||
throw new ArgumentException("action");
|
||||
|
||||
InitializeMoveOrReplace(action, new object[] { newItem }, new object[] { oldItem }, index, index);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Construct a NotifyCollectionChangedEventArgs that describes a multi-item Replace event.
|
||||
/// </summary>
|
||||
/// <param name="action">Can only be a Replace action.</param>
|
||||
/// <param name="newItems">The new items replacing the original items.</param>
|
||||
/// <param name="oldItems">The original items that are replaced.</param>
|
||||
public NotifyCollectionChangedEventArgs(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, IList newItems, IList oldItems)
|
||||
{
|
||||
if (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Replace)
|
||||
throw new ArgumentException("action");
|
||||
if (newItems == null)
|
||||
throw new ArgumentNullException("newItems");
|
||||
if (oldItems == null)
|
||||
throw new ArgumentNullException("oldItems");
|
||||
|
||||
InitializeMoveOrReplace(action, newItems, oldItems, -1, -1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Construct a NotifyCollectionChangedEventArgs that describes a multi-item Replace event.
|
||||
/// </summary>
|
||||
/// <param name="action">Can only be a Replace action.</param>
|
||||
/// <param name="newItems">The new items replacing the original items.</param>
|
||||
/// <param name="oldItems">The original items that are replaced.</param>
|
||||
/// <param name="startingIndex">The starting index of the items being replaced.</param>
|
||||
public NotifyCollectionChangedEventArgs(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, IList newItems, IList oldItems, int startingIndex)
|
||||
{
|
||||
if (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Replace)
|
||||
throw new ArgumentException("action");
|
||||
if (newItems == null)
|
||||
throw new ArgumentNullException("newItems");
|
||||
if (oldItems == null)
|
||||
throw new ArgumentNullException("oldItems");
|
||||
|
||||
InitializeMoveOrReplace(action, newItems, oldItems, startingIndex, startingIndex);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Construct a NotifyCollectionChangedEventArgs that describes a one-item Move event.
|
||||
/// </summary>
|
||||
/// <param name="action">Can only be a Move action.</param>
|
||||
/// <param name="changedItem">The item affected by the change.</param>
|
||||
/// <param name="index">The new index for the changed item.</param>
|
||||
/// <param name="oldIndex">The old index for the changed item.</param>
|
||||
public NotifyCollectionChangedEventArgs(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, object changedItem, int index, int oldIndex)
|
||||
{
|
||||
if (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Move)
|
||||
throw new ArgumentException("action");
|
||||
if (index < 0)
|
||||
throw new ArgumentException("index");
|
||||
|
||||
object[] changedItems = new object[] { changedItem };
|
||||
InitializeMoveOrReplace(action, changedItems, changedItems, index, oldIndex);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Construct a NotifyCollectionChangedEventArgs that describes a multi-item Move event.
|
||||
/// </summary>
|
||||
/// <param name="action">The action that caused the event.</param>
|
||||
/// <param name="changedItems">The items affected by the change.</param>
|
||||
/// <param name="index">The new index for the changed items.</param>
|
||||
/// <param name="oldIndex">The old index for the changed items.</param>
|
||||
public NotifyCollectionChangedEventArgs(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, IList changedItems, int index, int oldIndex)
|
||||
{
|
||||
if (action != PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Move)
|
||||
throw new ArgumentException("action");
|
||||
if (index < 0)
|
||||
throw new ArgumentException("index");
|
||||
|
||||
InitializeMoveOrReplace(action, changedItems, changedItems, index, oldIndex);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Construct a NotifyCollectionChangedEventArgs with given fields (no validation). Used by WinRT marshaling.
|
||||
/// </summary>
|
||||
internal NotifyCollectionChangedEventArgs(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, IList newItems, IList oldItems, int newIndex, int oldIndex)
|
||||
{
|
||||
_action = action;
|
||||
_newItems = (newItems == null) ? null : new ReadOnlyList(newItems);
|
||||
_oldItems = (oldItems == null) ? null : new ReadOnlyList(oldItems);
|
||||
_newStartingIndex = newIndex;
|
||||
_oldStartingIndex = oldIndex;
|
||||
}
|
||||
|
||||
private void InitializeAddOrRemove(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, IList changedItems, int startingIndex)
|
||||
{
|
||||
if (action == PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Add)
|
||||
InitializeAdd(action, changedItems, startingIndex);
|
||||
else if (action == PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction.Remove)
|
||||
InitializeRemove(action, changedItems, startingIndex);
|
||||
else
|
||||
Debug.Assert(false, String.Format("Unsupported action: {0}", action.ToString()));
|
||||
}
|
||||
|
||||
private void InitializeAdd(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, IList newItems, int newStartingIndex)
|
||||
{
|
||||
_action = action;
|
||||
_newItems = (newItems == null) ? null : new ReadOnlyList(newItems);
|
||||
_newStartingIndex = newStartingIndex;
|
||||
}
|
||||
|
||||
private void InitializeRemove(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, IList oldItems, int oldStartingIndex)
|
||||
{
|
||||
_action = action;
|
||||
_oldItems = (oldItems == null) ? null : new ReadOnlyList(oldItems);
|
||||
_oldStartingIndex = oldStartingIndex;
|
||||
}
|
||||
|
||||
private void InitializeMoveOrReplace(PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction action, IList newItems, IList oldItems, int startingIndex, int oldStartingIndex)
|
||||
{
|
||||
InitializeAdd(action, newItems, startingIndex);
|
||||
InitializeRemove(action, oldItems, oldStartingIndex);
|
||||
}
|
||||
|
||||
//------------------------------------------------------
|
||||
//
|
||||
// Public Properties
|
||||
//
|
||||
//------------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// The action that caused the event.
|
||||
/// </summary>
|
||||
public PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction Action
|
||||
{
|
||||
get { return _action; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The items affected by the change.
|
||||
/// </summary>
|
||||
public IList NewItems
|
||||
{
|
||||
get { return _newItems; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The old items affected by the change (for Replace events).
|
||||
/// </summary>
|
||||
public IList OldItems
|
||||
{
|
||||
get { return _oldItems; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The index where the change occurred.
|
||||
/// </summary>
|
||||
public int NewStartingIndex
|
||||
{
|
||||
get { return _newStartingIndex; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The old index where the change occurred (for Move events).
|
||||
/// </summary>
|
||||
public int OldStartingIndex
|
||||
{
|
||||
get { return _oldStartingIndex; }
|
||||
}
|
||||
|
||||
//------------------------------------------------------
|
||||
//
|
||||
// Private Fields
|
||||
//
|
||||
//------------------------------------------------------
|
||||
|
||||
private PlatformSupport.Collections.Specialized.NotifyCollectionChangedAction _action;
|
||||
private IList _newItems, _oldItems;
|
||||
private int _newStartingIndex = -1;
|
||||
private int _oldStartingIndex = -1;
|
||||
}
|
||||
|
||||
internal sealed class ReadOnlyList : IList
|
||||
{
|
||||
private readonly IList _list;
|
||||
|
||||
internal ReadOnlyList(IList list)
|
||||
{
|
||||
Debug.Assert(list != null);
|
||||
|
||||
_list = list;
|
||||
}
|
||||
|
||||
public int Count
|
||||
{
|
||||
get { return _list.Count; }
|
||||
}
|
||||
|
||||
public bool IsReadOnly
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
public bool IsFixedSize
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
public bool IsSynchronized
|
||||
{
|
||||
get { return _list.IsSynchronized; }
|
||||
}
|
||||
|
||||
public object this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
return _list[index];
|
||||
}
|
||||
set
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
|
||||
public object SyncRoot
|
||||
{
|
||||
get { return _list.SyncRoot; }
|
||||
}
|
||||
|
||||
public int Add(object value)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
public bool Contains(object value)
|
||||
{
|
||||
return _list.Contains(value);
|
||||
}
|
||||
|
||||
public void CopyTo(Array array, int index)
|
||||
{
|
||||
_list.CopyTo(array, index);
|
||||
}
|
||||
|
||||
public IEnumerator GetEnumerator()
|
||||
{
|
||||
return _list.GetEnumerator();
|
||||
}
|
||||
|
||||
public int IndexOf(object value)
|
||||
{
|
||||
return _list.IndexOf(value);
|
||||
}
|
||||
|
||||
public void Insert(int index, object value)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
public void Remove(object value)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
public void RemoveAt(int index)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6c341e6fb73ee42268f3d07f5ced3268
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user