<UserControl x:Class="DNA.UniProductionOrders.Views.Page.EmployeeSelector"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800" x:Name="self" VerticalAlignment="Stretch">
<StackPanel Orientation="Vertical" HorizontalAlignment="Stretch" Margin="0 0 0 10">
<Label FontWeight="Bold">Recente werknemers</Label>
<ItemsControl ItemsSource="{Binding Path=RecentEmployees}" VerticalAlignment="Stretch" Margin="0 0 0 10">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="4" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Click="Button_Click" Content="{Binding Path=KeyName}" Margin="10 5 0 0" Height="30" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Grid VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*" />
<ColumnDefinition Width="50*" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" FontWeight="Bold">Geselecteerde werknemer</Label>
<ComboBox Grid.Column="1" x:Name="CmbEmployee"
ItemsSource="{Binding Path=Employees}"
SelectedItem="{Binding SelectedEmployee}"
Text="{Binding Path=SearchText,ElementName=self,UpdateSourceTrigger=PropertyChanged}"
IsEditable="True"
StaysOpenOnEdit="True"
DisplayMemberPath="KeyName"
PreviewTextInput="CmbEmployee_PreviewTextInput" SelectionChanged="CmbEmployee_SelectionChanged">
<!--<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=KeyName}" />
</DataTemplate>
</ComboBox.ItemTemplate>-->
</ComboBox>
</Grid>
</StackPanel>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using Uniconta.ClientTools.DataModel;
namespace DNA.UniProductionOrders.Views.Page
{
public partial class EmployeeSelector : UserControl
{
public IEnumerable<EmployeeClientUser> RecentEmployees { get; set; }
public IEnumerable<EmployeeClientUser> Employees { get; set; }
public static readonly DependencyProperty SelectedEmployeeProperty = DependencyProperty.Register(nameof(SelectedEmployee), typeof(EmployeeClientUser), typeof(EmployeeSelector), new PropertyMetadata((EmployeeClient)null));
public EmployeeClientUser SelectedEmployee
{
get => (EmployeeClientUser)GetValue(SelectedEmployeeProperty);
set {
SetValue(SelectedEmployeeProperty, value);
EmployeeSelected?.Invoke(null, value);
}
}
private string _searchText;
public string SearchText
{
get => _searchText;
set
{
if (_searchText == value) return;
_searchText = value;
SearchTextChanged();
}
}
public event EventHandler<EmployeeClientUser> EmployeeSelected;
public EmployeeSelector()
{
InitializeComponent();
DataContext = this;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (!(sender is FrameworkElement source)) return;
if (source.DataContext is EmployeeClientUser employee)
{
CmbEmployee.ItemsSource = Employees;
SelectedEmployee = employee;
}
}
public void ClearFields()
{
SelectedEmployee = null;
}
private void CmbEmployee_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
SelectedEmployee = CmbEmployee.SelectedItem as EmployeeClientUser;
}
private void SearchTextChanged()
{
if (string.IsNullOrWhiteSpace(SearchText))
{
CmbEmployee.ItemsSource = Employees;
return;
}
var filtered = Employees.Where(em => em.Name.IndexOf(SearchText, StringComparison.OrdinalIgnoreCase) >= 0);
if (filtered.Any()) {
CmbEmployee.ItemsSource = filtered;
} else {
CmbEmployee.ItemsSource = Employees;
}
}
private void CmbEmployee_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
CmbEmployee.IsDropDownOpen = true;
}
}
}
450400cookie-checkXAML / WPF Combobox with search