JD2022-TU1/main/tools/framework/JD.Sequencers/Times/AttachedControlCollection.cs

92 lines
2.8 KiB
C#

using JD.Collections;
using JD.Collections.Extensions;
using JD.Collections.Interfaces;
using JD.Kernel.StaticHelpers;
using JD.Sequencers.Windowlesses;
namespace JD.Sequencers.Times
{
public class AttachedControlCollection<TControl> : ObservableList<TControl>
where TControl : WindowlessControl
{
#region Variables
private readonly IObservableList<WindowlessControl> m_originalCollection;
#endregion
#region Constructor
public AttachedControlCollection(IObservableList<WindowlessControl> originalCollection)
{
Throw.IfNull(originalCollection, "originalCollection");
Throw.InvalidArgumentIf(originalCollection.IsReadOnly, "Original collection is readonly", "originalCollection");
m_originalCollection = originalCollection;
m_originalCollection.CollectionChanged += m_originalCollection_CollectionChanged;
}
#endregion
#region Methods
protected override void OnCollectionChanged(CollectionChangedEventArgs<TControl> e)
{
base.OnCollectionChanged(e);
switch (e.Action)
{
case CollectionChangeAction.ItemAdded:
if (!m_originalCollection.Contains(e.Item))
{
m_originalCollection.Add(e.Item);
}
break;
case CollectionChangeAction.ItemRemoved:
m_originalCollection.Remove(e.Item);
break;
case CollectionChangeAction.Cleared:
m_originalCollection.RemoveAll(IsTControl);
break;
}
}
private static bool IsTControl(WindowlessControl control)
{
return control is TControl;
}
#endregion
#region Event Handlers
void m_originalCollection_CollectionChanged(object sender, CollectionChangedEventArgs<WindowlessControl> e)
{
switch (e.Action)
{
case CollectionChangeAction.ItemAdded:
TControl addedControl = e.Item as TControl;
if (addedControl != null && !Contains(addedControl))
{
Add(addedControl);
}
break;
case CollectionChangeAction.ItemRemoved:
TControl removedControl = e.Item as TControl;
if (removedControl != null)
{
Remove(removedControl);
}
break;
case CollectionChangeAction.Cleared:
Clear();
break;
}
}
#endregion
}
}