169 lines
5.1 KiB
C#
169 lines
5.1 KiB
C#
|
//---------------------------------------------------------------------------
|
||
|
//
|
||
|
// <copyright file="ReadOnlyObservableCollection.cs" company="Microsoft">
|
||
|
// Copyright (C) 2003 by Microsoft Corporation. All rights reserved.
|
||
|
// </copyright>
|
||
|
//
|
||
|
//
|
||
|
// Description: Read-only wrapper around an ObservableCollection.
|
||
|
//
|
||
|
// See spec at http://avalon/connecteddata/Specs/Collection%20Interfaces.mht
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Collections.Specialized;
|
||
|
using System.ComponentModel;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
|
||
|
namespace System.Collections.ObjectModel
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Read-only wrapper around an ObservableCollection.
|
||
|
/// </summary>
|
||
|
#if !FEATURE_NETCORE
|
||
|
[Serializable()]
|
||
|
#if !MOBILE
|
||
|
[TypeForwardedFrom("WindowsBase, Version=3.0.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]
|
||
|
#endif
|
||
|
#endif
|
||
|
public class ReadOnlyObservableCollection<T> : ReadOnlyCollection<T>, INotifyCollectionChanged, INotifyPropertyChanged
|
||
|
{
|
||
|
#region Constructors
|
||
|
|
||
|
//------------------------------------------------------
|
||
|
//
|
||
|
// Constructors
|
||
|
//
|
||
|
//------------------------------------------------------
|
||
|
|
||
|
/// <summary>
|
||
|
/// Initializes a new instance of ReadOnlyObservableCollection that
|
||
|
/// wraps the given ObservableCollection.
|
||
|
/// </summary>
|
||
|
public ReadOnlyObservableCollection(ObservableCollection<T> list) : base(list)
|
||
|
{
|
||
|
((INotifyCollectionChanged)Items).CollectionChanged += new NotifyCollectionChangedEventHandler(HandleCollectionChanged);
|
||
|
((INotifyPropertyChanged)Items).PropertyChanged += new PropertyChangedEventHandler(HandlePropertyChanged);
|
||
|
}
|
||
|
|
||
|
#endregion Constructors
|
||
|
|
||
|
#region Interfaces
|
||
|
|
||
|
//------------------------------------------------------
|
||
|
//
|
||
|
// Interfaces
|
||
|
//
|
||
|
//------------------------------------------------------
|
||
|
|
||
|
#region INotifyCollectionChanged
|
||
|
|
||
|
/// <summary>
|
||
|
/// CollectionChanged event (per <see cref="INotifyCollectionChanged" />).
|
||
|
/// </summary>
|
||
|
event NotifyCollectionChangedEventHandler INotifyCollectionChanged.CollectionChanged
|
||
|
{
|
||
|
add { CollectionChanged += value; }
|
||
|
remove { CollectionChanged -= value; }
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Occurs when the collection changes, either by adding or removing an item.
|
||
|
/// </summary>
|
||
|
/// <remarks>
|
||
|
/// see <seealso cref="INotifyCollectionChanged"/>
|
||
|
/// </remarks>
|
||
|
#if !FEATURE_NETCORE
|
||
|
[field:NonSerializedAttribute()]
|
||
|
#endif
|
||
|
protected virtual event NotifyCollectionChangedEventHandler CollectionChanged;
|
||
|
|
||
|
/// <summary>
|
||
|
/// raise CollectionChanged event to any listeners
|
||
|
/// </summary>
|
||
|
protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs args)
|
||
|
{
|
||
|
if (CollectionChanged != null)
|
||
|
{
|
||
|
CollectionChanged(this, args);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endregion INotifyCollectionChanged
|
||
|
|
||
|
#region INotifyPropertyChanged
|
||
|
|
||
|
/// <summary>
|
||
|
/// PropertyChanged event (per <see cref="INotifyPropertyChanged" />).
|
||
|
/// </summary>
|
||
|
event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
|
||
|
{
|
||
|
add { PropertyChanged += value; }
|
||
|
remove { PropertyChanged -= value; }
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Occurs when a property changes.
|
||
|
/// </summary>
|
||
|
/// <remarks>
|
||
|
/// see <seealso cref="INotifyPropertyChanged"/>
|
||
|
/// </remarks>
|
||
|
#if !FEATURE_NETCORE
|
||
|
[field:NonSerializedAttribute()]
|
||
|
#endif
|
||
|
protected virtual event PropertyChangedEventHandler PropertyChanged;
|
||
|
|
||
|
/// <summary>
|
||
|
/// raise PropertyChanged event to any listeners
|
||
|
/// </summary>
|
||
|
protected virtual void OnPropertyChanged(PropertyChangedEventArgs args)
|
||
|
{
|
||
|
if (PropertyChanged != null)
|
||
|
{
|
||
|
PropertyChanged(this, args);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endregion INotifyPropertyChanged
|
||
|
|
||
|
#endregion Interfaces
|
||
|
|
||
|
#region Private Methods
|
||
|
|
||
|
//------------------------------------------------------
|
||
|
//
|
||
|
// Private Methods
|
||
|
//
|
||
|
//------------------------------------------------------
|
||
|
|
||
|
// forward CollectionChanged events from the base list to our listeners
|
||
|
void HandleCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
|
||
|
{
|
||
|
OnCollectionChanged(e);
|
||
|
}
|
||
|
|
||
|
// forward PropertyChanged events from the base list to our listeners
|
||
|
void HandlePropertyChanged(object sender, PropertyChangedEventArgs e)
|
||
|
{
|
||
|
OnPropertyChanged(e);
|
||
|
}
|
||
|
|
||
|
#endregion Private Methods
|
||
|
|
||
|
#region Private Fields
|
||
|
|
||
|
//------------------------------------------------------
|
||
|
//
|
||
|
// Private Fields
|
||
|
//
|
||
|
//------------------------------------------------------
|
||
|
|
||
|
#endregion Private Fields
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|