Advertisement
ortem_kats

Filter ComboBox

Feb 17th, 2020
783
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.63 KB | None | 0 0
  1. <Window x:Class="WpfApp1.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6.        
  7.         mc:Ignorable="d"
  8.         Title="MainWindow" SizeToContent="WidthAndHeight" PreviewKeyDown="Window_PreviewKeyDown">
  9.     <Grid>
  10.         <Grid.ColumnDefinitions>
  11.             <ColumnDefinition Width="300"/>
  12.             <ColumnDefinition Width="150"/>
  13.         </Grid.ColumnDefinitions>
  14.         <Grid.RowDefinitions>
  15.             <RowDefinition Height="30"/>
  16.             <RowDefinition Height="300"/>
  17.         </Grid.RowDefinitions>
  18.  
  19.         <ComboBox Grid.Row="0" Grid.Column="0" Name="cmb1" DisplayMemberPath="Name" IsEditable="True" IsTextSearchEnabled="False" DataObject.Pasting="cmb_Pasting" PreviewKeyDown="cmb_PreviewKeyDown" PreviewTextInput="cmb_PreviewTextInput">
  20.             <ComboBox.ItemContainerStyle>
  21.                 <Style TargetType="ComboBoxItem">
  22.                     <EventSetter Event="PreviewMouseLeftButtonUp" Handler="ComboBoxItem_PreviewMouseLeftButtonUp"/>
  23.                 </Style>
  24.             </ComboBox.ItemContainerStyle>
  25.         </ComboBox>
  26.         <ComboBox Grid.Row="0" Grid.Column="1" Name="cmb2" DisplayMemberPath="Name" IsEditable="True" IsTextSearchEnabled="False" DataObject.Pasting="cmb_Pasting" PreviewKeyDown="cmb_PreviewKeyDown" PreviewTextInput="cmb_PreviewTextInput">
  27.             <ComboBox.ItemContainerStyle>
  28.                 <Style TargetType="ComboBoxItem">
  29.                     <EventSetter Event="PreviewMouseLeftButtonUp" Handler="ComboBoxItem_PreviewMouseLeftButtonUp"/>
  30.                 </Style>
  31.             </ComboBox.ItemContainerStyle>
  32.         </ComboBox>
  33.  
  34.         <TextBox Grid.Row="1" Grid.Column="0" x:Name="info"/>
  35.     </Grid>
  36. </Window>
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43. using System;
  44. using System.Collections;
  45. using System.Collections.Generic;
  46. using System.Linq;
  47. using System.Text;
  48. using System.Threading.Tasks;
  49. using System.Windows;
  50. using System.Windows.Controls;
  51. using System.Windows.Data;
  52. using System.Windows.Documents;
  53. using System.Windows.Input;
  54. using System.Windows.Media;
  55. using System.Windows.Media.Imaging;
  56. using System.Windows.Navigation;
  57. using System.Windows.Shapes;
  58.  
  59. namespace WpfApp1
  60. {
  61.     /// <summary>
  62.     /// Логика взаимодействия для MainWindow.xaml
  63.     /// </summary>
  64.     public partial class MainWindow : Window
  65.     {
  66.         List<Person> persons;
  67.         List<NameClass> names;
  68.         List<StreetClass> streets;
  69.         string currInput = string.Empty;
  70.  
  71.         public MainWindow()
  72.         {
  73.             InitializeComponent();
  74.  
  75.             names = new List<NameClass>
  76.             {
  77.                 new NameClass("123", "Кацевалов Артем"),
  78.                 new NameClass("456", "Гавриленко Клим"),
  79.                 new NameClass("789", "Плаксин Владислав"),
  80.                 new NameClass("000", "Исаков Владислав"),
  81.             };
  82.             streets = new List<StreetClass>
  83.             {
  84.                 new StreetClass("123", "Смирнова"),
  85.                 new StreetClass("456", "Давыдова"),
  86.                 new StreetClass("789", "Победы"),
  87.                 new StreetClass("000", "Арбат"),
  88.             };
  89.  
  90.             persons = new List<Person>
  91.             {
  92.                 new Person("Кацевалов Артем", "Смирнова"),
  93.                 new Person("Гавриленко Клим", "Арбат"),
  94.                 new Person("Исаков Владислав", "Давыдова"),
  95.                 new Person("Гавриленко Клим", "Смирнова"),
  96.                 new Person("Плаксин Владислав", "Давыдова"),
  97.                 new Person("Кацевалов Артем", "Победы")
  98.             };
  99.  
  100.             cmb1.ItemsSource = names;
  101.             cmb2.ItemsSource = streets;
  102.             cmb1.Items.Refresh();
  103.             cmb2.Items.Refresh();
  104.         }
  105.  
  106.         public static T GetChildOfType<T>(DependencyObject depObj) where T : DependencyObject
  107.         {
  108.             if (depObj == null) return null;
  109.  
  110.             for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
  111.             {
  112.                 var child = VisualTreeHelper.GetChild(depObj, i);
  113.  
  114.                 var result = (child as T) ?? GetChildOfType<T>(child);
  115.                 if (result != null) return result;
  116.             }
  117.             return null;
  118.         }
  119.  
  120.         private void cmb_PreviewKeyDown(object sender, KeyEventArgs e)
  121.         {
  122.             if (e.Key == Key.Back || e.Key == Key.Delete)
  123.             {
  124.                 ComboBox cmb = (ComboBox)sender;
  125.  
  126.                 if (!string.IsNullOrEmpty(cmb.Text) && cmb.Text.Length > 1 && cmb.Text.Length > GetChildOfType<TextBox>(cmb).SelectedText.Length)
  127.                 {
  128.                     if (cmb == cmb1)
  129.                         cmb.ItemsSource = names.Where(p => p.Name.IndexOf(cmb.Text, StringComparison.InvariantCultureIgnoreCase) != -1).ToList();
  130.                     else if (cmb == cmb2)
  131.                         cmb.ItemsSource = streets.Where(p => p.Name.IndexOf(cmb.Text, StringComparison.InvariantCultureIgnoreCase) != -1).ToList();
  132.                     cmb.IsDropDownOpen = true;
  133.                 }
  134.                 else
  135.                 {
  136.                     if (cmb == cmb1)
  137.                         cmb.ItemsSource = names;
  138.                     else if (cmb == cmb2)
  139.                         cmb.ItemsSource = streets;
  140.                     cmb.IsDropDownOpen = false;
  141.                     cmb.SelectedItem = null;
  142.                 }
  143.                 //cmb.Focus();
  144.             }
  145.         }
  146.  
  147.         private void FilterRequest()
  148.         {
  149.             Person per;
  150.             try
  151.             {
  152.                 per = persons.Where(p => p.Name.Equals((cmb1.SelectedItem as NameClass)?.Name) && p.Street == (cmb2.SelectedItem as StreetClass)?.Name).ToList()[0];
  153.             }
  154.             catch (Exception ex)
  155.             {
  156.                 Console.WriteLine(ex.Message);
  157.                 info.Clear();
  158.                 return;
  159.             }
  160.             info.Text = $"\n\n\n\n\nName: {per?.Name}\nStreet: {per?.Street}";
  161.         }
  162.  
  163.         private void cmb_PreviewTextInput(object sender, TextCompositionEventArgs e)
  164.         {
  165.             ComboBox cmb = (ComboBox)sender;
  166.  
  167.             cmb.IsDropDownOpen = true;
  168.  
  169.             if (!string.IsNullOrEmpty(cmb.Text) && !(GetChildOfType<TextBox>(cmb).SelectedText.Length == cmb.Text.Length))
  170.             {
  171.                 if (cmb == cmb1)
  172.                     cmb.ItemsSource = names.Where(p => p.Name.IndexOf(cmb.Text, StringComparison.InvariantCultureIgnoreCase) != -1).ToList();
  173.                 else if (cmb == cmb2)
  174.                     cmb.ItemsSource = streets.Where(p => p.Name.IndexOf(cmb.Text, StringComparison.InvariantCultureIgnoreCase) != -1).ToList();
  175.                 cmb.IsDropDownOpen = true;
  176.  
  177.                 currInput = cmb.Text.Insert(GetChildOfType<TextBox>(cmb).CaretIndex, e.Text);
  178.             }
  179.             else if (!string.IsNullOrEmpty(e.Text))
  180.             {
  181.                 if (cmb == cmb1)
  182.                     cmb.ItemsSource = names.Where(p => p.Name.IndexOf(e.Text, StringComparison.InvariantCultureIgnoreCase) != -1).ToList();
  183.                 else if (cmb == cmb2)
  184.                     cmb.ItemsSource = streets.Where(p => p.Name.IndexOf(e.Text, StringComparison.InvariantCultureIgnoreCase) != -1).ToList();
  185.             }
  186.             else
  187.             {
  188.                 if (cmb == cmb1)
  189.                     cmb.ItemsSource = names;
  190.                 else if (cmb == cmb2)
  191.                     cmb.ItemsSource = streets;
  192.             }
  193.         }
  194.  
  195.         private void cmb_Pasting(object sender, DataObjectPastingEventArgs e)
  196.         {
  197.             ComboBox cmb = (ComboBox)sender;
  198.  
  199.             cmb.IsDropDownOpen = true;
  200.  
  201.             string pastedText = (string)e.DataObject.GetData(typeof(string));
  202.             currInput = cmb.Text.Insert(GetChildOfType<TextBox>(cmb).CaretIndex, pastedText);
  203.  
  204.             if (!string.IsNullOrEmpty(currInput))
  205.             {
  206.                 if (cmb == cmb1)
  207.                     cmb.ItemsSource = names.Where(p => p.Name.IndexOf(currInput, StringComparison.InvariantCultureIgnoreCase) != -1).ToList();
  208.                 else if (cmb == cmb2)
  209.                     cmb.ItemsSource = streets.Where(p => p.Name.IndexOf(currInput, StringComparison.InvariantCultureIgnoreCase) != -1).ToList();
  210.             }
  211.             else
  212.             {
  213.                 if (cmb == cmb1)
  214.                     cmb.ItemsSource = names;
  215.                 else if (cmb == cmb2)
  216.                     cmb.ItemsSource = streets;
  217.             }
  218.         }
  219.  
  220.         private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
  221.         {
  222.             if ((e.Key == Key.Down || e.Key == Key.Up) && e.Source is ComboBox)
  223.             {
  224.                 (e.Source as ComboBox).IsDropDownOpen = true;
  225.             }
  226.             else if ((e.Key == Key.Enter || e.Key == Key.Return) && e.Source is ComboBox)
  227.             {
  228.                 if ((e.Source as ComboBox).SelectedItem == null) return;
  229.                 currInput = (e.Source as ComboBox).Text;
  230.                 FilterRequest();
  231.             }
  232.         }
  233.  
  234.         private void ComboBoxItem_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  235.         {
  236.             if ((sender as ComboBoxItem).DataContext is NameClass)
  237.             {
  238.                 cmb1.SelectedItem = names.Where(p => p.ID == ((sender as ComboBoxItem).DataContext as NameClass)?.ID).ToList()[0];
  239.                 currInput = cmb1.Text;
  240.             }
  241.             else if ((sender as ComboBoxItem).DataContext is StreetClass)
  242.             {
  243.                 cmb2.SelectedItem = streets.Where(a => a.ID == ((sender as ComboBoxItem).DataContext as StreetClass)?.ID).ToList()[0];
  244.                 currInput = cmb2.Text;
  245.             }
  246.             FilterRequest();
  247.         }
  248.     }
  249.  
  250.     public class Person
  251.     {
  252.        
  253.         public string Name { get; set; }
  254.         public string Street { get; set; }
  255.  
  256.         public Person(string n, string s) { Name = n; Street = s; }
  257.     }
  258.  
  259.     public class NameClass
  260.     {
  261.         public string ID { get; set; }
  262.         public string Name { get; set; }
  263.  
  264.         public NameClass(string i, string n) { ID = i; Name = n; }
  265.     }
  266.  
  267.     public class StreetClass
  268.     {
  269.         public string ID { get; set; }
  270.         public string Name { get; set; }
  271.  
  272.         public StreetClass(string i, string n) { ID = i; Name = n; }
  273.     }
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement