From c3ba2d5c96db71f4ed69beb81680765e278f059a Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Tue, 21 Jul 2020 23:35:55 +0800 Subject: [PATCH] fixed #446 --- .../Controls/Transfer/Transfer.cs | 69 +++++++++++++------ .../Controls/Transfer/TransferGroup.cs | 4 +- 2 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/Shared/HandyControl_Shared/Controls/Transfer/Transfer.cs b/src/Shared/HandyControl_Shared/Controls/Transfer/Transfer.cs index 1658b40f..75354351 100644 --- a/src/Shared/HandyControl_Shared/Controls/Transfer/Transfer.cs +++ b/src/Shared/HandyControl_Shared/Controls/Transfer/Transfer.cs @@ -57,7 +57,7 @@ namespace HandyControl.Controls public IList SelectedItems { - get => (IList) GetValue(SelectedItemsProperty); + get => (IList)GetValue(SelectedItemsProperty); set => SetValue(SelectedItemsProperty, value); } @@ -98,16 +98,18 @@ namespace HandyControl.Controls } } - private void AddItem(object item) + private void InsertItem(int index, object item, bool isTransferred = false) { var origin = new TransferItem { - Content = item + Content = item, + IsTransferred = isTransferred }; var selected = new TransferItem { Content = item, - IsOrigin = false + IsOrigin = false, + IsTransferred = isTransferred }; var entry = new TransferEntry { @@ -115,11 +117,13 @@ namespace HandyControl.Controls SelectedItem = selected }; _entryDic.Add(item, entry); - _entryList.Add(entry); - _itemsOrigin.Items.Add(origin); - _itemsSelected.Items.Add(selected); + _entryList.Insert(index, entry); + _itemsOrigin.Items.Insert(index, origin); + _itemsSelected.Items.Insert(index, selected); } + private void AddItem(object item) => InsertItem(_entryDic.Count, item); + private void RemoveItem(object item) { if (_entryDic.TryGetValue(item, out var entry)) @@ -178,19 +182,42 @@ namespace HandyControl.Controls return; } - if (e.OldItems != null) + switch (e.Action) { - foreach (var item in e.OldItems) - { - RemoveItem(item); - } - } - if (e.NewItems != null) - { - foreach (var item in e.NewItems) - { - AddItem(item); - } + case NotifyCollectionChangedAction.Add: + if (e.NewItems != null) + { + foreach (var item in e.NewItems) + { + AddItem(item); + } + } + break; + case NotifyCollectionChangedAction.Remove: + if (e.OldItems != null) + { + foreach (var item in e.OldItems) + { + RemoveItem(item); + } + } + break; + case NotifyCollectionChangedAction.Replace: + case NotifyCollectionChangedAction.Move: + if (e.OldItems != null && e.NewItems != null) + { + var oldItem = e.OldItems[0]; + if (_entryDic.TryGetValue(oldItem, out var entry)) + { + var isTransferred = entry.SelectedItem.IsTransferred; + RemoveItem(oldItem); + InsertItem(e.NewStartingIndex, e.NewItems[0], isTransferred); + } + } + break; + case NotifyCollectionChangedAction.Reset: + ClearItems(); + break; } } @@ -219,12 +246,12 @@ namespace HandyControl.Controls protected override void OnItemTemplateChanged(DependencyPropertyChangedEventArgs e) { - + } protected override void OnItemContainerStyleChanged(DependencyPropertyChangedEventArgs e) { - + } protected override void Refresh() diff --git a/src/Shared/HandyControl_Shared/Controls/Transfer/TransferGroup.cs b/src/Shared/HandyControl_Shared/Controls/Transfer/TransferGroup.cs index 2ffdb8cc..cc6a2478 100644 --- a/src/Shared/HandyControl_Shared/Controls/Transfer/TransferGroup.cs +++ b/src/Shared/HandyControl_Shared/Controls/Transfer/TransferGroup.cs @@ -43,10 +43,10 @@ namespace HandyControl.Controls } if (e.NewItems != null) { - foreach (FrameworkElement item in e.NewItems) + if (e.NewItems[0] is FrameworkElement item) { item.Style = ItemContainerStyle; - ItemsHost.Children.Add(item); + ItemsHost.Children.Insert(e.NewStartingIndex, item); } } }