Skip to content

Commit

Permalink
enhance: close #1275
Browse files Browse the repository at this point in the history
  • Loading branch information
NaBian committed Oct 31, 2022
1 parent dc1085e commit 4178b24
Showing 1 changed file with 65 additions and 17 deletions.
82 changes: 65 additions & 17 deletions src/Shared/HandyControl_Shared/Controls/Transfer/Transfer.cs
Original file line number Diff line number Diff line change
@@ -1,33 +1,48 @@
using System.ComponentModel;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using HandyControl.Collections;
using HandyControl.Data;
using HandyControl.Interactivity;

namespace HandyControl.Controls;

[TemplatePart(Name = ElementSelectedListBox, Type = typeof(ListBox))]
[DefaultEvent(nameof(Transferred))]
[DefaultEvent(nameof(TransferredItemsChanged))]
public class Transfer : ListBox
{
private const string ElementSelectedListBox = "PART_SelectedListBox";

public static readonly RoutedEvent TransferredEvent =
EventManager.RegisterRoutedEvent("Transferred", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(Transfer));
public static readonly RoutedEvent TransferredItemsChangedEvent =
EventManager.RegisterRoutedEvent("TransferredItemsChanged", RoutingStrategy.Bubble,
typeof(SelectionChangedEventHandler), typeof(Transfer));

[Category("Behavior")]
public event RoutedEventHandler Transferred
public event SelectionChangedEventHandler TransferredItemsChanged
{
add => AddHandler(TransferredEvent, value);
remove => RemoveHandler(TransferredEvent, value);
add => AddHandler(TransferredItemsChangedEvent, value);
remove => RemoveHandler(TransferredItemsChangedEvent, value);
}

private ListBox _selectedListBox;

private static readonly DependencyPropertyKey TransferredItemsPropertyKey =
DependencyProperty.RegisterReadOnly("TransferredItems", typeof(IList),
typeof(Transfer), new FrameworkPropertyMetadata((IList) null));

private static readonly DependencyProperty TransferredItemsImplProperty =
TransferredItemsPropertyKey.DependencyProperty;

[Bindable(true), Category("Appearance"), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public IList TransferredItems => TransferredItemsImpl;

private IList TransferredItemsImpl => (IList) GetValue(TransferredItemsImplProperty);

public Transfer()
{
CommandBindings.Add(new CommandBinding(ControlCommands.Selected, SelectItems));
Expand All @@ -47,7 +62,7 @@ public override void OnApplyTemplate()
_selectedListBox = GetTemplateChild(ElementSelectedListBox) as ListBox;
}

protected virtual void OnTransferred(RoutedEventArgs e)
protected virtual void OnTransferredItemsChanged(SelectionChangedEventArgs e)
{
RaiseEvent(e);
}
Expand All @@ -58,7 +73,7 @@ protected virtual void OnTransferred(RoutedEventArgs e)

private void SelectItems(object sender, ExecutedRoutedEventArgs e)
{
if (_selectedListBox == null)
if (_selectedListBox == null || SelectedItems.Count == 0)
{
return;
}
Expand Down Expand Up @@ -89,7 +104,12 @@ private void SelectItems(object sender, ExecutedRoutedEventArgs e)
_selectedListBox.Items.Add(transferItem);
}

OnTransferred(new RoutedEventArgs(TransferredEvent, this));
SetTransferredItems(_selectedListBox.Items.OfType<TransferItem>().Select(item => item.Tag));
OnTransferredItemsChanged(new SelectionChangedEventArgs(TransferredItemsChangedEvent, new List<object>(), SelectedItems)
{
Source = this
});
UnselectAll();
}

private void DeselectItems(object sender, ExecutedRoutedEventArgs e)
Expand All @@ -99,22 +119,50 @@ private void DeselectItems(object sender, ExecutedRoutedEventArgs e)
return;
}

var deselectItems = new List<object>();
foreach (var transferItem in _selectedListBox.Items.OfType<TransferItem>().ToList())
{
if (!transferItem.IsSelected)
{
continue;
}

if (ItemContainerGenerator.ContainerFromItem(transferItem.Tag) is TransferItem selectedItem)
if (ItemContainerGenerator.ContainerFromItem(transferItem.Tag) is not TransferItem selectedItem)
{
_selectedListBox.Items.Remove(transferItem);

selectedItem.SetCurrentValue(TransferItem.IsTransferredProperty, ValueBoxes.FalseBox);
selectedItem.SetCurrentValue(ListBoxItem.IsSelectedProperty, ValueBoxes.FalseBox);
continue;
}

_selectedListBox.Items.Remove(transferItem);
deselectItems.Add(transferItem.Tag);
selectedItem.SetCurrentValue(TransferItem.IsTransferredProperty, ValueBoxes.FalseBox);
selectedItem.SetCurrentValue(ListBoxItem.IsSelectedProperty, ValueBoxes.FalseBox);
}

SetTransferredItems(_selectedListBox.Items.OfType<TransferItem>().Select(item => item.Tag));
OnTransferredItemsChanged(new SelectionChangedEventArgs(TransferredItemsChangedEvent, deselectItems, new List<object>())
{
Source = this
});
}

private void SetTransferredItems(IEnumerable selectedItems)
{
var oldSelectedItems = (ManualObservableCollection<object>) GetValue(TransferredItemsImplProperty);

if (oldSelectedItems == null)
{
oldSelectedItems = new ManualObservableCollection<object>();
SetValue(TransferredItemsPropertyKey, oldSelectedItems);
}

oldSelectedItems.CanNotify = false;
oldSelectedItems.Clear();

foreach (var selectedItem in selectedItems)
{
oldSelectedItems.Add(selectedItem);
}

OnTransferred(new RoutedEventArgs(TransferredEvent, this));
oldSelectedItems.CanNotify = true;
}
}

0 comments on commit 4178b24

Please sign in to comment.