94 lines
3.5 KiB
C#
94 lines
3.5 KiB
C#
using System.Collections;
|
|
using System.Collections.Specialized;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
|
|
namespace Filtration.Views.AttachedProperties
|
|
{
|
|
public static class SelectedItemsAttachedProperty
|
|
{
|
|
public static readonly DependencyProperty SelectedItemsProperty =
|
|
DependencyProperty.RegisterAttached("SelectedItems", typeof(IList), typeof(SelectedItemsAttachedProperty),
|
|
new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnSelectedItemsChanged)));
|
|
|
|
public static IList GetSelectedItems(DependencyObject obj)
|
|
{
|
|
return (IList)obj.GetValue(SelectedItemsProperty);
|
|
}
|
|
|
|
public static void SetSelectedItems(DependencyObject obj, IList value)
|
|
{
|
|
obj.SetValue(SelectedItemsProperty, value);
|
|
}
|
|
|
|
private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
var listbox = d as ListBox;
|
|
if (listbox != null)
|
|
{
|
|
listbox.SelectedItems.Clear();
|
|
var selectedItems = e.NewValue as IList;
|
|
if (selectedItems != null)
|
|
{
|
|
foreach (var item in selectedItems)
|
|
{
|
|
listbox.SelectedItems.Add(item);
|
|
}
|
|
|
|
listbox.SelectionChanged += (s, ev) =>
|
|
{
|
|
if (null != ev.RemovedItems)
|
|
{
|
|
foreach (var item in ev.RemovedItems)
|
|
{
|
|
selectedItems.Remove(item);
|
|
}
|
|
}
|
|
if (null != ev.AddedItems)
|
|
{
|
|
foreach (var item in ev.AddedItems)
|
|
{
|
|
if (!selectedItems.Contains(item))
|
|
{
|
|
selectedItems.Add(item);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
if (selectedItems is INotifyCollectionChanged)
|
|
{
|
|
(selectedItems as INotifyCollectionChanged).CollectionChanged += (s, ev) =>
|
|
{
|
|
// If this is the case, list requires re-adding all
|
|
if (ev.Action == NotifyCollectionChangedAction.Reset)
|
|
{
|
|
listbox.SelectedItems.Clear();
|
|
}
|
|
|
|
if (null != ev.OldItems)
|
|
{
|
|
foreach (var item in ev.OldItems)
|
|
{
|
|
listbox.SelectedItems.Remove(item);
|
|
}
|
|
}
|
|
|
|
if (null != ev.NewItems)
|
|
{
|
|
foreach (var item in ev.NewItems)
|
|
{
|
|
if (!listbox.SelectedItems.Contains(item))
|
|
{
|
|
listbox.SelectedItems.Add(item);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|