WPF学习笔记(12)下拉框控件ComboBox与数据模板

发布于:2025-07-04 ⋅ 阅读:(21) ⋅ 点赞:(0)


一、ComboBox

1. ComboBox概述

ComboBox类代表一个有下拉列表的选择控件,供用户选择。
官方文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.controls.combobox?view=netframework-4.8
在这里插入图片描述

2. ItemsControl类

ItemsControl类是列表、下拉框、菜单、表格等一系列选项的基类,部分属性如下:

属性 说 明
ltemsSource 获取或设置用于生成 ltemsControl 的内容的集合。设置
ltemsSource 属性后,集合ltems是只读且固定大小的,因此不可修改。
ltems 获取用于生成 ltemsControl 的内容的集合,
DisplayMemberPath 获取或设置源对象上的值的路径,以用作对象的可视表示形式,不能同时设置 DisplayMemberPath 和ltemTemplate.
ItemTemplate 获取或设置用来显示每个项的数据模板DataTemplate。
ltemContainerStyle 获取或设置应用于为每个项生成的容器元素的 Style。

3. Selector类

Selector类允许用户从其元素中选择项的控件。部分属性和事件如下:

属性 说 明
SelectedIndex 获取或设置当前选择中第一项的索引,如果选择为空返回-1。
Selectedltem 获取或设置当前选择中的第一项,如果选择为空返回 null。
SelectedValue 获取或设置当前选择中的第一项的某个成员值。
SelectedValuePath 通常与 SelectedValue 属性一起使用,用于指定控件中选定项目的属性。
事件 说 明
Selected 当选择项时发生。
SelectionChanged 当选择更改时发生。
UnSelected 当取消选择项时发生。

4. ComboBox类

ComboBox类的部分属性与事件如下:

属性 说 明
SelecedtIndex 获取默认显示项,索引从0起始
IsEditable 获取或设置一个值,该值指示启用或禁用 ComboBox 的文本框中的文本编辑。
IsReadOnly 获取或设置启用仅限选择模式的值,在此模式中,可选择但不可编辑组合框中的内容。
IsDropDownOpen 获取或设置一个值,该值指示组合框的下拉部分当前是否打开。
MaxDropDownHeight 获取或设置组合框下拉部分的最大高度。
Text 获取或设置当前选定项的文本。
事件 说 明
DropDownOpened 当关闭组合框的下拉列表时发生
DropDownClosed 当打开组合框的下拉列表时发生

MainWindow.xaml界面的属性面板部分属性设置如图:
在这里插入图片描述
ComboBox控件内填写下拉框内容有三种实现方式,第一种通过ComboBox.ItemsSource,第二种通过ComboBoxItem,第三种通过MainWindow.xaml.cs界面的C#代码,第三种方式与第一种设置效果等同。
在这里插入图片描述

    <Grid>
        <!--ComboBox.ItemsSource实现-->
        <ComboBox x:Name="comboBox1"  HorizontalAlignment="Left" Margin="285,89,0,0" VerticalAlignment="Top" Width="216" Height="27" FontSize="20">
            <ComboBox.ItemsSource>
                <Collections:ArrayList>
                    <system:String>高等数学</system:String>
                    <system:String>线性代数</system:String>
                    <system:String>数率统计</system:String>
                    <Rectangle Fill="red" Width="30" Height="20"/>
                </Collections:ArrayList>
            </ComboBox.ItemsSource>
        </ComboBox>

        <!--ComboBoxItem实现-->
        <ComboBox x:Name="comboBox2"  HorizontalAlignment="Left" Margin="285,160,0,0" VerticalAlignment="Top" Width="216" Height="27" FontSize="20">
            <ComboBoxItem>美术</ComboBoxItem>
            <ComboBoxItem>音乐</ComboBoxItem>
            <ComboBoxItem>体育</ComboBoxItem>
        </ComboBox>

        <!--C#代码实现-->
        <ComboBox x:Name="comboBox3"  HorizontalAlignment="Left" Margin="285,229,0,0" VerticalAlignment="Top" Width="216" Height="27" FontSize="20"/>
    </Grid>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<string> list = new List<string>();
        list.Add("C++");
        list.Add("Java");
        list.Add("Python");
        //数据源赋值
        comboBox3.ItemsSource = list;
    }
}

ComboBox控件最常用事件为SelectionChanged
在这里插入图片描述

//创建学生类,包含ID, Name, Score三个属性
public class Stu
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Score { get; set; }
    public Stu(int id, string name, int score)
    {
        Id = id;
        Name = name;
        Score = score;
    }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        comboBox3.SelectionChanged += comboBox3_SelectionChanged;

        List<Stu> list = new List<Stu>
        {
        new Stu(1, "张三", 100),
        new Stu(2, "李四", 80),
        new Stu(3, "王五", 75)
        };

        comboBox3.ItemsSource = list;

        // 显示的字段,下拉框界面上显示的是姓名
        comboBox3.DisplayMemberPath = "Name";

        //选择的值的字段,SelectedValue获取的值是分数
        comboBox3.SelectedValuePath = "Score";

    }

    private void comboBox3_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
       // 不设置 SelectedValuePath属性的时候,Selectedltem与 SelectedValue 一样
       //设置了 SelectedValuePath属性,那么 SelectedValue 就会按Path指定的属性显示
        Console.WriteLine(comboBox3.SelectedItem + "->" + comboBox3.SelectedValue);
    }
}

二、ComboBox数据模板

通过在MainWindow.xaml界面的window.resources 定义数据模板,然后使用ComboBox类继承的ItemTemplate属性引用,示例代码如下:

public class Stu
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Score { get; set; }
    public Stu(int id, string name, int score)
    {
        Id = id;
        Name = name;
        Score = score;
    }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Stu> list = new List<Stu>
        {
            new Stu(1, "张三", 100),
            new Stu(2, "李四", 80),
            new Stu(3, "王五", 75)
        };

        comboBox.ItemsSource = list;

        comboBox.SelectionChanged += comboBox_SelectionChanged;
    }

    private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Console.WriteLine(comboBox.SelectedItem + "->" + comboBox.SelectedValue);
    }
}
    <Window.Resources>
        <DataTemplate x:Key="myDT">
            <StackPanel>
                <TextBlock Text="{Binding Path=Id}" Foreground="Red" />
                <TextBlock Text="{Binding Path=Name}" Foreground="Green" />
                <TextBlock Text="{Binding Path=Score}" Foreground="Blue" />
            </StackPanel>
        </DataTemplate>
    </Window.Resources>

    <Grid>
        <ComboBox x:Name="comboBox" 
                  ItemTemplate="{StaticResource myDT}"
                  HorizontalAlignment="Center" Height="55"
                  Margin="0,120,0,0"
                  VerticalAlignment="Top"
                  Width="260"/>
    </Grid>

在这里插入图片描述

总结

  • ComboBox控件内容的三种实现方式
  • 数据模板定义方法

网站公告

今日签到

点亮在社区的每一天
去签到