{"id":4504,"date":"2021-01-27T15:36:03","date_gmt":"2021-01-27T14:36:03","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=4504"},"modified":"2021-01-27T15:36:03","modified_gmt":"2021-01-27T14:36:03","slug":"xaml-wpf-combobox-with-search","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/xaml-wpf-combobox-with-search\/","title":{"rendered":"XAML \/ WPF Combobox with search"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;UserControl x:Class=\"DNA.UniProductionOrders.Views.Page.EmployeeSelector\"\n             xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\"\n             xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\"\n             xmlns:mc=\"http:\/\/schemas.openxmlformats.org\/markup-compatibility\/2006\" \n             xmlns:d=\"http:\/\/schemas.microsoft.com\/expression\/blend\/2008\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"450\" d:DesignWidth=\"800\" x:Name=\"self\" VerticalAlignment=\"Stretch\">\n    &lt;StackPanel Orientation=\"Vertical\" HorizontalAlignment=\"Stretch\"  Margin=\"0 0 0 10\">\n        &lt;Label FontWeight=\"Bold\">Recente werknemers&lt;\/Label>\n        &lt;ItemsControl ItemsSource=\"{Binding Path=RecentEmployees}\" VerticalAlignment=\"Stretch\" Margin=\"0 0 0 10\">\n            &lt;ItemsControl.ItemsPanel>\n                &lt;ItemsPanelTemplate>\n                    &lt;UniformGrid Columns=\"4\" \/>\n                &lt;\/ItemsPanelTemplate>\n            &lt;\/ItemsControl.ItemsPanel>\n            \n            &lt;ItemsControl.ItemTemplate>\n                &lt;DataTemplate>\n                    &lt;Button Click=\"Button_Click\" Content=\"{Binding Path=KeyName}\" Margin=\"10 5 0 0\" Height=\"30\" \/>\n                &lt;\/DataTemplate>\n            &lt;\/ItemsControl.ItemTemplate>\n        &lt;\/ItemsControl>\n        &lt;Grid VerticalAlignment=\"Stretch\">\n            &lt;Grid.ColumnDefinitions>\n                &lt;ColumnDefinition Width=\"50*\" \/>\n                &lt;ColumnDefinition Width=\"50*\" \/>\n            &lt;\/Grid.ColumnDefinitions>\n\n            &lt;Label Grid.Column=\"0\" FontWeight=\"Bold\">Geselecteerde werknemer&lt;\/Label>\n            &lt;ComboBox Grid.Column=\"1\" x:Name=\"CmbEmployee\" \n                      ItemsSource=\"{Binding Path=Employees}\" \n                      SelectedItem=\"{Binding SelectedEmployee}\" \n                      Text=\"{Binding Path=SearchText,ElementName=self,UpdateSourceTrigger=PropertyChanged}\" \n                      IsEditable=\"True\" \n                      StaysOpenOnEdit=\"True\" \n                      DisplayMemberPath=\"KeyName\" \n                      PreviewTextInput=\"CmbEmployee_PreviewTextInput\" SelectionChanged=\"CmbEmployee_SelectionChanged\">\n                &lt;!--&lt;ComboBox.ItemTemplate>\n                    &lt;DataTemplate>\n                        &lt;TextBlock Text=\"{Binding Path=KeyName}\" \/>\n                    &lt;\/DataTemplate>\n                &lt;\/ComboBox.ItemTemplate>-->\n            &lt;\/ComboBox>\n        &lt;\/Grid>\n    &lt;\/StackPanel>\n&lt;\/UserControl>\n<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows;\nusing System.Windows.Controls;\nusing Uniconta.ClientTools.DataModel;\n\nnamespace DNA.UniProductionOrders.Views.Page\n{\n    public partial class EmployeeSelector : UserControl\n    {\n        public IEnumerable&lt;EmployeeClientUser> RecentEmployees { get; set; }\n        public IEnumerable&lt;EmployeeClientUser> Employees { get; set; }\n\n        public static readonly DependencyProperty SelectedEmployeeProperty = DependencyProperty.Register(nameof(SelectedEmployee), typeof(EmployeeClientUser), typeof(EmployeeSelector), new PropertyMetadata((EmployeeClient)null));\n        public EmployeeClientUser SelectedEmployee\n        {\n            get => (EmployeeClientUser)GetValue(SelectedEmployeeProperty);\n            set {\n                SetValue(SelectedEmployeeProperty, value);\n                EmployeeSelected?.Invoke(null, value);\n            }\n        }\n\n        private string _searchText;\n        public string SearchText\n        {\n            get => _searchText;\n            set\n            {\n                if (_searchText == value) return;\n                _searchText = value;\n                SearchTextChanged();\n            }\n        }\n\n        public event EventHandler&lt;EmployeeClientUser> EmployeeSelected;\n\n        public EmployeeSelector()\n        {\n            InitializeComponent();\n            DataContext = this;\n        }\n\n        private void Button_Click(object sender, RoutedEventArgs e)\n        {\n            if (!(sender is FrameworkElement source)) return;\n\n            if (source.DataContext is EmployeeClientUser employee)\n            {\n                CmbEmployee.ItemsSource = Employees;\n                SelectedEmployee = employee;\n            }\n        }\n\n        public void ClearFields()\n        {\n            SelectedEmployee = null;\n        }\n\n        private void CmbEmployee_SelectionChanged(object sender, SelectionChangedEventArgs e)\n        {\n            SelectedEmployee = CmbEmployee.SelectedItem as EmployeeClientUser;\n        }\n\n        private void SearchTextChanged()\n        {\n            if (string.IsNullOrWhiteSpace(SearchText))\n            {\n                CmbEmployee.ItemsSource = Employees;\n                return;\n            }\n            var filtered = Employees.Where(em => em.Name.IndexOf(SearchText, StringComparison.OrdinalIgnoreCase) >= 0);\n            if (filtered.Any()) { \n                CmbEmployee.ItemsSource = filtered;\n            } else {\n                CmbEmployee.ItemsSource = Employees;\n            }\n        }\n\n        private void CmbEmployee_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)\n        {\n            CmbEmployee.IsDropDownOpen = true;\n        }\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4504","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=4504"}],"version-history":[{"count":1,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4504\/revisions"}],"predecessor-version":[{"id":4505,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4504\/revisions\/4505"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=4504"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=4504"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=4504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}