Как бы предотвратить отображение SelectedItem в ComboBox? - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь создать панель поиска из поля со списком, который позволяет пользователю вводить только имя. То, что я хочу сделать, это заполнить редактируемую область первым именем, однако она просто перезаписывает эту область SelectedItem. Я знаю, что был один человек, который задавал этот вопрос раньше, однако он возник, когда я пошел на go проверку их ответа .

Как мне go об этом, где он использует SelectedItem, но не показывает его вне выпадающего списка?

Обратите внимание, это отфильтрованный комбинированный список, созданный с использованием this примера; также весь код C#, который я здесь показываю, взят из одного и того же файла. В vm.DataSource просто хранится коллекция класса WorkerInfoView, поэтому фильтрация работает с тем, что я настроил.

C# OnKeyDownHandler:

        // Handles the filtering based on what's typed in
        private void OnKeyDownHandler_EntryFNameSearch(Object sender, KeyEventArgs e)
        {
            CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(vm.DataSource);
            ArrayList workerList = new ArrayList();

            itemsViewOriginal.Filter = ((o) =>
            {
                if (String.IsNullOrEmpty(FNameSearchEntry.Text))
                {
                    AssembleWorkerList.Clear();
                    workerList.Clear();
                    return true;
                }
                else
                {
                    if (e.Key.ToString().Length == 1 && char.IsLetter(Convert.ToChar(e.Key.ToString())))
                    {
                        WorkerInfoView view = (WorkerInfoView)o;
                        if ((((WorkerInfoView)o).FName.ToString().ToUpper()).Contains(FNameSearchEntry.Text.ToUpper() + (e.Key).ToString()))
                        {
                            // Covers the possibility of marked typos showing up in the filter
                            if (view.DoNotUse == false)
                            {
                                AssembleWorkerList.Add(o);
                                return true;
                            }
                            else return false;
                        }
                        else return false;
                    }
                    else return false;
                }
            });
            if (AssembleWorkerList.Count > 0)
                workerList = new ArrayList(AssembleWorkerList);
            if (e.Key.ToString().Length == 1)
                FNameSearchEntry.ItemsSource = workerList;
            FNameSearchEntry.IsDropDownOpen = true;

            itemsViewOriginal.Refresh();
            AssembleWorkerList.Clear();
        }

C# OnKeyUpHandler:

        // Handles the case of Backspace/Delete being hit
        private void OnKeyUpHandler_EntryFNameSearch(Object sender, KeyEventArgs e)
        {
            CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(vm.DataSource);
            AssembleWorkerList.Clear();
            ArrayList workerList = new ArrayList();

            itemsViewOriginal.Filter = ((o) =>
            {
                if (String.IsNullOrEmpty(FNameSearchEntry.Text))
                {
                    AssembleWorkerList.Clear();
                    workerList.Clear();
                    return true;
                }
                else
                {
                    if (e.Key == Key.Back || e.Key == Key.Delete)
                    {
                        WorkerInfoView view = (WorkerInfoView)o;
                        if ((((WorkerInfoView)o).FName.ToString()).Contains(FNameSearchEntry.Text))
                        {
                            if (view.DoNotUse == false)
                            {
                                AssembleWorkerList.Add(o);
                                return true;
                            }
                            else return false;
                        }
                        else return false;
                    }
                    else return false;
                }
            });
            if (e.Key == Key.Back || e.Key == Key.Delete)
            {
                if (AssembleWorkerList.Count > 0)
                    workerList = new ArrayList(AssembleWorkerList);
                if (e.Key != Key.LeftShift && e.Key != Key.RightShift)
                    FNameSearchEntry.ItemsSource = workerList;
                FNameSearchEntry.IsDropDownOpen = true;
            }

            itemsViewOriginal.Refresh();
        }

C# Функции для обработки выбора имени в раскрывающемся списке:

        private void EntryFNameDataSelection_Event(Object sender, SelectionChangedEventArgs args)
        {
            ComboBox selectedPerson = (ComboBox)sender;
            if (selectedPerson == null) return;
            if (selectedPerson.Items == null) return;
            if (selectedPerson.Items.CurrentItem == null) return;
            WorkerInfoView view = (WorkerInfoView)selectedPerson.SelectedItem;
            if (view == null) return;
            ValuePass(view);
        }

        // a function that just passes values to XAML elements
        private void ValuePass(WorkerInfoView view)
        {
            FNameSearchEntry.Text = view.FName;
            // other elements that are just textboxes
        }

XAML (searchName выполняет поиск по первому и последнему, в то время как FNameSearchEntry выполняет только поиск по Имя):

<TextBlock Text="Name Search: " HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,10,0,0"
           TextWrapping="Wrap" FontSize="14"/>

<ComboBox x:Name="searchName"  IsTextSearchEnabled="False" HorizontalAlignment="Left" VerticalAlignment="Top"
          Height="23" Width="256" Margin="10,30,0,0" IsEditable="True" IsDropDownOpen="False"
          StaysOpenOnEdit="True" SelectionChanged="EntryFullnameDataSelection_Event"
          KeyDown="OnKeyDownHandler_EntryFullnameSearch" KeyUp="OnKeyUpHandler_EntryFullnameSearch"/>

<TextBlock Text="First Name/ Search: " HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,75,0,0"
           TextWrapping="Wrap" FontSize="14"/>

<ComboBox x:Name="FNameSearchEntry" IsTextSearchEnabled="False" HorizontalAlignment="Left" VerticalAlignment="Top"
          Height="23" Width="256" Margin="10,104,0,0" IsEditable="True" IsDropDownOpen="False"
          StaysOpenOnEdit="True" SelectionChanged="EntryFNameDataSelection_Event"
          KeyDown="OnKeyDownHandler_EntryFNameSearch" KeyUp="OnKeyUpHandler_EntryFNameSearch"/>

Дайте мне знать, если потребуется дополнительная информация, и я с радостью помогу!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...