WPF 自定义下拉框:实现模糊查询和多列显示

本文将介绍如何创建一个自定义的下拉框控件,它继承自 ComboBox 类并实现模糊查询和多列显示的功能。

创建自定义下拉框类

首先,我们需要创建一个自定义的下拉框类,继承自 ComboBox 类:

public class MyComboBox : ComboBox
{
    // ...
}

接着,我们需要在类中添加一些必要的属性和方法:

public class MyComboBox : ComboBox
{
    // 数据源
    private IEnumerable _itemsSource;

    // 每列的宽度
    public List<double> ColumnWidths { get; set; } 

    // 显示列的属性名称
    public List<string> DisplayMemberPaths { get; set; } 

    // 模糊查询的属性名称
    public string FilterMemberPath { get; set; } 

    // 构造函数
    public MyComboBox()
    {
        // 初始化属性
        ColumnWidths = new List<double>();
        DisplayMemberPaths = new List<string>();
        FilterMemberPath = "";
    }

    // 设置数据源
    public void SetItemsSource(IEnumerable itemsSource)
    {
        _itemsSource = itemsSource;
        ItemsSource = _itemsSource;
    }

    // 根据输入的字符模糊查询并显示数据
    public void Filter(string text)
    {
        if (_itemsSource == null) return;

        // 根据输入的字符进行模糊查询
        var filteredItems = _itemsSource.Cast<object>()
            .Where(item => item.GetType().GetProperty(FilterMemberPath).GetValue(item).ToString().Contains(text))
            .ToList();

        // 清空原有数据并添加新数据
        Items.Clear();
        foreach (var item in filteredItems)
        {
            var content = new StackPanel();
            for (int i = 0; i < DisplayMemberPaths.Count; i++)
            {
                var propertyValue = item.GetType().GetProperty(DisplayMemberPaths[i]).GetValue(item).ToString();
                var textBlock = new TextBlock()
                {
                    Text = propertyValue,
                    Width = ColumnWidths[i],
                    TextWrapping = TextWrapping.NoWrap,
                    Margin = new Thickness(2, 2, 2, 2)
                };
                content.Children.Add(textBlock);
            }
            Items.Add(content);
        }
    }
}

在上面的代码中,我们定义了以下属性:

  • _itemsSource:数据源。
  • ColumnWidths:每列的宽度。
  • DisplayMemberPaths:显示列的属性名称。
  • FilterMemberPath:模糊查询的属性名称。

并且定义了以下方法:

  • SetItemsSource:设置数据源。
  • Filter:根据输入的字符模糊查询并显示数据。

Filter 方法中,我们首先根据输入的字符进行模糊查询,然后清空原有数据并添加新数据。对于每一行数据,我们使用一个 StackPanel 来存放每一列的 TextBlock,每个 TextBlock 的宽度和 Margin 根据 ColumnWidths 进行设置。

在WPF界面中使用自定义下拉框

最后,我们可以在WPF界面中使用 MyComboBox 类:

<Window x:Class="WpfApp1.MainWindow"
        xmlns:local="clr-namespace:WpfApp1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <local:MyComboBox x:Name="myComboBox" Margin="10">
            <local:MyComboBox.ColumnWidths>
                <x:Double>100</x:Double>
                <x:Double>200</x:Double>
            </local:MyComboBox.ColumnWidths>
            <local:MyComboBox.DisplayMemberPaths>
                <x:String>Id</x:String>
                <x:String>Name</x:String>
            </local:MyComboBox.DisplayMemberPaths>
        </local:MyComboBox>
    </Grid>
</Window>

在上面的代码中,我们首先引入了自定义的命名空间 local,然后在 Grid 中添加了一个 MyComboBox,并设置了 ColumnWidthsDisplayMemberPaths 属性。

设置数据源并进行模糊查询

最后,我们可以在代码中设置数据源并根据输入的字符进行模糊查询:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // 创建数据源
        var items = new List<Item>();
        for (int i = 0; i < 10000; i++)
        {
            items.Add(new Item() { Id = i, Name = "Item " + i });
        }

        // 设置数据源
        myComboBox.SetItemsSource(items);

        // 根据输入的字符进行模糊查询
        myComboBox.Filter("5");
    }
}

public class Item
{
    public int Id { get; set; } 
    public string Name { get; set; }
}

解决 x:Double 标记无法识别问题

如果在XAML代码中遇到“http://schemas.microsoft.com/winfx/2006/xaml”中无法识别标记“x:Double”的错误提示,则需要在 Window 标签中添加以下代码:

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

这样就可以正确使用 x:Double 标记了。

通过以上步骤,我们便成功创建了一个自定义的下拉框控件,并实现了模糊查询和多列显示的功能。你可以根据需要调整属性和方法,以满足你的具体需求。

WPF 自定义下拉框:实现模糊查询和多列显示

原文地址: https://www.cveoy.top/t/topic/kqRq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录