Advertisement
joebpimentel

TestC#

Apr 6th, 2020
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.38 KB | None | 0 0
  1. public class MultiSelectionBehavior : Behavior<ListBox>
  2. {
  3.     protected override void OnAttached()
  4.     {
  5.         base.OnAttached();
  6.         if (SelectedItems != null)
  7.         {
  8.             AssociatedObject.SelectedItems.Clear();
  9.             foreach (var item in SelectedItems)
  10.             {
  11.                 AssociatedObject.SelectedItems.Add(item);
  12.             }
  13.         }
  14.     }
  15.  
  16.     public IList SelectedItems
  17.     {
  18.         get { return (IList)GetValue(SelectedItemsProperty); }
  19.         set { SetValue(SelectedItemsProperty, value); }
  20.     }
  21.  
  22.     public static readonly DependencyProperty SelectedItemsProperty =
  23.         DependencyProperty.Register("SelectedItems", typeof(IList), typeof(MultiSelectionBehavior), new UIPropertyMetadata(null, SelectedItemsChanged));
  24.  
  25.     private static void SelectedItemsChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
  26.     {
  27.         var behavior = o as MultiSelectionBehavior;
  28.         if (behavior == null)
  29.             return;
  30.  
  31.         var oldValue = e.OldValue as INotifyCollectionChanged;
  32.         var newValue = e.NewValue as INotifyCollectionChanged;
  33.  
  34.         if (oldValue != null)
  35.         {
  36.             oldValue.CollectionChanged -= behavior.SourceCollectionChanged;
  37.             behavior.AssociatedObject.SelectionChanged -= behavior.ListBoxSelectionChanged;
  38.         }
  39.         if (newValue != null)
  40.         {
  41.             behavior.AssociatedObject.SelectedItems.Clear();
  42.             foreach (var item in (IEnumerable)newValue)
  43.             {
  44.                 behavior.AssociatedObject.SelectedItems.Add(item);
  45.             }
  46.  
  47.             behavior.AssociatedObject.SelectionChanged += behavior.ListBoxSelectionChanged;
  48.             newValue.CollectionChanged += behavior.SourceCollectionChanged;
  49.         }
  50.     }
  51.  
  52.     private bool _isUpdatingTarget;
  53.     private bool _isUpdatingSource;
  54.  
  55.     void SourceCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
  56.     {
  57.         if (_isUpdatingSource)
  58.             return;
  59.  
  60.         try
  61.         {
  62.             _isUpdatingTarget = true;
  63.  
  64.             if (e.OldItems != null)
  65.             {
  66.                 foreach (var item in e.OldItems)
  67.                 {
  68.                     AssociatedObject.SelectedItems.Remove(item);
  69.                 }
  70.             }
  71.  
  72.             if (e.NewItems != null)
  73.             {
  74.                 foreach (var item in e.NewItems)
  75.                 {
  76.                     AssociatedObject.SelectedItems.Add(item);
  77.                 }
  78.             }
  79.  
  80.             if (e.Action == NotifyCollectionChangedAction.Reset)
  81.             {
  82.                 AssociatedObject.SelectedItems.Clear();
  83.             }
  84.         }
  85.         finally
  86.         {
  87.             _isUpdatingTarget = false;
  88.         }
  89.     }
  90.  
  91.     private void ListBoxSelectionChanged(object sender, SelectionChangedEventArgs e)
  92.     {
  93.         if (_isUpdatingTarget)
  94.             return;
  95.  
  96.         var selectedItems = this.SelectedItems;
  97.         if (selectedItems == null)
  98.             return;
  99.  
  100.         try
  101.         {
  102.             _isUpdatingSource = true;
  103.  
  104.             foreach (var item in e.RemovedItems)
  105.             {
  106.                 selectedItems.Remove(item);
  107.             }
  108.  
  109.             foreach (var item in e.AddedItems)
  110.             {
  111.                 selectedItems.Add(item);
  112.             }
  113.         }
  114.         finally
  115.         {
  116.             _isUpdatingSource = false;
  117.         }
  118.     }
  119.  
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement