|
//---------------------------------------------------------------------------
//
// <copyright file="AnnotationResourceCollection.cs" company="Microsoft">
// Copyright (C) 2003 by Microsoft Corporation. All rights reserved.
// </copyright>
//
// Description: Subclass of AnnotationObservableCollection<T> which has slightly different
// eventing behavior for ClearItems and SetItem methods. This class
// is used specifically for AnnotationResources.
//
// History:
// 03/10/2005 : rruiz - created
//
//---------------------------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Annotations;
using System.Windows.Data;
namespace MS.Internal.Annotations
{
/// <summary>
/// Subclass of AnnotationObservableCollection which has slightly different
/// eventing behavior for ClearItems and SetItem methods. This class
/// is used specifically for AnnotationResources.
/// </summary>
internal sealed class AnnotationResourceCollection : AnnotationObservableCollection<AnnotationResource>
{
//------------------------------------------------------
//
// Constructors
//
//------------------------------------------------------
#region Constructors
/// <summary>
/// Initializes a new instance of AnnotationResourceCollection that is empty and has default initial capacity.
/// </summary>
public AnnotationResourceCollection() : base()
{
}
#endregion Constructors
//------------------------------------------------------
//
// Public Events
//
//------------------------------------------------------
#region Public Events
/// <summary>
/// Event fired when an item in the collection changes (fires a PropertyChanged event).
/// </summary>
public event PropertyChangedEventHandler ItemChanged;
#endregion Public Events
//------------------------------------------------------
//
// Protected Methods
//
//------------------------------------------------------
#region Protected Methods
/// <summary>
/// Override this method and provide a different set of events
/// when items are cleared from the collection. Specifically,
/// fire a Remove event for each item in the collection.
/// </summary>
protected override void ProtectedClearItems()
{
// We want to fire for each item in the list
List<AnnotationResource> list = new List<AnnotationResource>(this);
Items.Clear(); // directly clear Collection<T> inner Items collection
OnPropertyChanged(CountString);
OnPropertyChanged(IndexerName);
OnCollectionCleared(list);
}
/// <summary>
/// Override this method and provide a different set of events
/// when an item is set on a given index in this collection.
/// Specifically, fire a both a Remove and Add event (as the
/// grand-parent class ObservableCollection does).
/// </summary>
/// <param name="index">index of item to set</param>
/// <param name="item">item to set at that index</param>
protected override void ProtectedSetItem(int index, AnnotationResource item)
{
// Use the standard built in events (one for item removed and one for item added)
ObservableCollectionSetItem(index, item); // Calls raw ObservableCollection method
}
#endregion Protected Methods
//------------------------------------------------------
//
// Private Methods
//
//------------------------------------------------------
#region Private Methods
// fire an event for each item removed from the collection
void OnCollectionCleared(IEnumerable<AnnotationResource> list)
{
foreach(object item in list)
{
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, 0));
}
}
private void OnPropertyChanged(string propertyName)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
// raise CollectionChanged event to any listeners
protected override void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (ItemChanged != null)
{
ItemChanged(sender, e);
}
}
#endregion Private Methods
}
}
|