From 7f58e70e72f9704884f38d4d7c1809e8b0bbc10a Mon Sep 17 00:00:00 2001 From: Victoria Plitt Date: Mon, 6 Apr 2020 18:07:11 +0200 Subject: MultiSelectionComboBox control. Added scroll, open popup on focus textbox. --- .../Tango.SharedUI/Controls/MultiSelectComboBox.cs | 180 +++++---------------- .../Controls/MultiSelectComboBoxItem.cs | 39 +++++ 2 files changed, 78 insertions(+), 141 deletions(-) create mode 100644 Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBoxItem.cs (limited to 'Software/Visual_Studio/Tango.SharedUI/Controls') diff --git a/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs b/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs index 94f263be7..dcbc35f60 100644 --- a/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs +++ b/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs @@ -34,35 +34,6 @@ namespace Tango.SharedUI.Controls } } - interface IMultiSelectComboBoxItem - { - string Text { get; set; } - } - public class MultiSelectComboBoxItem : IMultiSelectComboBoxItem - { - public string Text { get; set; } - public MultiSelectComboBoxItem(string text) - { - Text = text; - } - public override string ToString() - { - return Text; - } - } - public class MultiSelectComboBoxSearchItem : IMultiSelectComboBoxItem - { - public string Text { get; set; } - public MultiSelectComboBoxSearchItem(string text = "") - { - Text = text; - } - public override string ToString() - { - return Text; - } - } - [TemplatePart(Name = MultiSelectComboBox.PartEditor, Type = typeof(TextBox))] [TemplatePart(Name = MultiSelectComboBox.PartPopup, Type = typeof(Popup))] public class MultiSelectComboBox : Control @@ -83,9 +54,9 @@ namespace Tango.SharedUI.Controls public MultiSelectComboBox() : base() { SelectedItemsList = new ObservableCollection(); - RemoveAllCommand = new RelayCommand((() => SelectedItemsList.Clear()), () => SelectedItemsList != null && SelectedItemsList.Count > 0); + RemoveAllCommand = new RelayCommand(RemoveAllSelectedItems, () => SelectedItemsList != null && SelectedItemsList.Count > 1); RemoveItemCommand = new RelayCommand((item) => SelectedItemsList.Remove(item), () => SelectedItemsList != null); - AddItemCommand = new RelayCommand((item) => SelectedItemsList.Add(new MultiSelectComboBoxItem(item))); + AddItemCommand = new RelayCommand((item) => SelectedItemsList.Insert(SelectedItemsList.Count-1, new MultiSelectComboBoxItem(item))); SearchText = new MultiSelectComboBoxSearchItem(); Loaded += MultiSelectComboBox_Loaded; _isLoaded = false; @@ -120,14 +91,6 @@ namespace Tango.SharedUI.Controls set { _fetchTimer = value; } } - //private SelectionAdapter _selectionAdapter; - - //public SelectionAdapter SelectionAdapter - //{ - // get { return _selectionAdapter; } - // set { _selectionAdapter = value; } - //} - public ObservableCollection SelectedItemsList { get { return (ObservableCollection)GetValue(SelectedItemsListProperty); } @@ -175,8 +138,9 @@ namespace Tango.SharedUI.Controls public MultiSelectComboBoxSearchItem SearchText { get { return _searchText; } - set {_searchText = value; - RaisePropertyChanged("SearchText"); + set + { + _searchText = value; OnTextChanged(); } } @@ -206,9 +170,11 @@ namespace Tango.SharedUI.Controls Editor.TextChanged += OnEditorTextChanged; Editor.PreviewKeyDown += OnEditorKeyDown; Editor.LostFocus += OnEditorLostFocus; + Editor.GotFocus += OnEditorGotFocus; } } } + this.GotFocus += SelTextBox_GotFocus; } } } @@ -220,23 +186,9 @@ namespace Tango.SharedUI.Controls if (String.IsNullOrEmpty(SearchText.Text)) SearchItemsList.Filter = null; else - SearchItemsList.Filter = new Predicate(o => ((string)o == SearchText.Text)); + SearchItemsList.Filter = new Predicate(o => (((string)o).ToLower().Contains(SearchText.Text.ToLower()))); } } - /// - /// Occurs when a property has changed. - /// - public event PropertyChangedEventHandler PropertyChanged; - - /// - /// Raises the property changed event. - /// - /// Name of the property. - protected virtual void RaisePropertyChanged(String propName) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); - } - /// /// When overridden in a derived class, is invoked whenever application code or internal processes call . /// @@ -247,31 +199,9 @@ namespace Tango.SharedUI.Controls SelectedItemsList = new ObservableCollection(); SelectedItemsList.Add(SearchText); - SearchItemsList = new ListCollectionView(this.Items); - - //DataTemplate temp = Template.FindName("SearchItem", this) as DataTemplate; - //Editor = Template.FindName(PartEditor, this) as TextBox; Popup = Template.FindName(PartPopup, this) as Popup; - //ItemsSelector = Template.FindName(PartSelector, this) as Selector; - //_partSelectedContent = Template.FindName("PART_SelectedContent", this) as ContentControl; - // BindingEvaluator = new BindingEvaluator(new Binding(DisplayMember)); - - if (Editor != null) - { - Editor.TextChanged += OnEditorTextChanged; - Editor.PreviewKeyDown += OnEditorKeyDown; - Editor.LostFocus += OnEditorLostFocus; - Editor.Focus(); - - //if (SelectedItem != null) - //{ - // Editor.Text = BindingEvaluator.Evaluate(SelectedItem); - //} - - } - - this.GotFocus += SelTextBox_GotFocus; + if (Popup != null) { @@ -279,25 +209,6 @@ namespace Tango.SharedUI.Controls Popup.Opened += OnPopupOpened; Popup.Closed += OnPopupClosed; } - //if (ItemsSelector != null) - //{ - // SelectionAdapter = new SelectionAdapter(ItemsSelector); - // SelectionAdapter.Commit += OnSelectionAdapterCommit; - // SelectionAdapter.Cancel += OnSelectionAdapterCancel; - // SelectionAdapter.SelectionChanged += OnSelectionAdapterSelectionChanged; - // ItemsSelector.PreviewMouseDown += ItemsSelector_PreviewMouseDown; - //} - - //_isUpdatingText = false; - - //ItemsControl iControl = FindName("asd") as ItemsControl; - //iControl.ItemContainerGenerator.ItemsChanged += ItemContainerGenerator_ItemsChanged; - //iControl.ItemContainerGenerator.ContainerFromItem(null); - - //for (int i = 0; i < iControl.Items.Count; i++) - //{ - // FrameworkElement a = iControl.ItemContainerGenerator.ContainerFromIndex(i) as FrameworkElement; - //} } private void OnEditorTextChanged(object sender, TextChangedEventArgs e) @@ -310,38 +221,24 @@ namespace Tango.SharedUI.Controls } FetchTimer.IsEnabled = false; FetchTimer.Stop(); - // SetSelectedItem(null); - if (Editor.Text.Length > 0) - { - // IsLoading = true; - IsToggleChecked = true; - // ItemsSelector.ItemsSource = null; - FetchTimer.IsEnabled = true; - FetchTimer.Start(); - } - else - { - IsToggleChecked = false; - } + IsToggleChecked = true; + + FetchTimer.IsEnabled = true; + FetchTimer.Start(); + } private void OnFetchTimerTick(object sender, EventArgs e) { FetchTimer.IsEnabled = false; FetchTimer.Stop(); + SearchText.Text = Editor.Text; + OnTextChanged(); } private void OnEditorKeyDown(object sender, KeyEventArgs e) { - //if (SelectionAdapter != null) - { - if (IsToggleChecked) - { - // SelectionAdapter.HandleKeyDown(e); - } - else - IsToggleChecked = e.Key == Key.Down || e.Key == Key.Up; - } + IsToggleChecked = true; } private void OnEditorLostFocus(object sender, RoutedEventArgs e) @@ -357,33 +254,20 @@ namespace Tango.SharedUI.Controls Editor?.Focus(); } - private void OnPopupOpened(object sender, EventArgs e) + private void OnEditorGotFocus(object sender, RoutedEventArgs e) { - //ItemsSelector.SelectedItem = SelectedItem; - } - private void OnPopupClosed(object sender, EventArgs e) - { - OnSelectionAdapterCommit(); - + IsToggleChecked = true; } - private void ItemContainerGenerator_ItemsChanged(object sender, System.Windows.Controls.Primitives.ItemsChangedEventArgs e) + + private void OnPopupOpened(object sender, EventArgs e) { } - private void OnSelectionAdapterCommit() + private void OnPopupClosed(object sender, EventArgs e) { IsToggleChecked = false; - // if (ItemsSelector.SelectedItem != null) - // { - // SelectedItem = ItemsSelector.SelectedItem; - // _isUpdatingText = true; - // Editor.Text = GetDisplayText(ItemsSelector.SelectedItem); - // SetSelectedItem(ItemsSelector.SelectedItem); - // _isUpdatingText = false; - // IsDropDownOpen = false; - // } - } + } #region Commands /// /// The remove all command property for clear SelectedItemsList @@ -405,15 +289,29 @@ namespace Tango.SharedUI.Controls private set { SetValue(RemoveItemCommandProperty, value); } } - + /// + /// The add item to SelectedItemsList command property + /// public static DependencyProperty AddItemCommandProperty = DependencyProperty.Register("AddItemCommand", typeof(RelayCommand), typeof(MultiSelectComboBox)); public RelayCommand AddItemCommand { get { return (RelayCommand)GetValue(AddItemCommandProperty); } private set { SetValue(AddItemCommandProperty, value); } } + + /// + /// Removes all selected items. + /// + private void RemoveAllSelectedItems() + { + int index = SelectedItemsList.Count - 2; + while (index >= 0) + { + SelectedItemsList.RemoveAt(index--); + } + } #endregion - + } } diff --git a/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBoxItem.cs b/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBoxItem.cs new file mode 100644 index 000000000..2dcaa977a --- /dev/null +++ b/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBoxItem.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.SharedUI.Controls +{ + interface IMultiSelectComboBoxItem + { + string Text { get; set; } + } + + public class MultiSelectComboBoxItem : IMultiSelectComboBoxItem + { + public string Text { get; set; } + public MultiSelectComboBoxItem(string text) + { + Text = text; + } + public override string ToString() + { + return Text; + } + } + + public class MultiSelectComboBoxSearchItem : IMultiSelectComboBoxItem + { + public string Text { get; set; } + public MultiSelectComboBoxSearchItem(string text = "") + { + Text = text; + } + public override string ToString() + { + return Text; + } + } +} -- cgit v1.3.1