wpf之ComboBox

前言

wpf中ComboBox的应用非常广泛,本文就来介绍ComboBox在wpf中的应用。

1、非MVVM模式下

1.1 xaml添加元素

csharp 复制代码
 <ComboBox x:Name="cbx_test1" SelectedIndex=" 0"  >
                <ComboBoxItem  >小明</ComboBoxItem  >
                <ComboBoxItem  >小王</ComboBoxItem  >
                <ComboBoxItem  >小陈</ComboBoxItem  >
            </ComboBox >

1.2 代码添加元素

MainWindow是新建wpf程序时的主窗体类

csharp 复制代码
   public MainWindow()
        {
            InitializeComponent();
            cbx_test1.Items.Add("小李");
        }

1.3 将ComboBox选中的值赋值给string类型的变量

1.3.1 针对xaml添加的元素

直接添加事件SelectionChanged

csharp 复制代码
<ComboBox x:Name="cbx_test1" SelectedIndex=" 0"  SelectionChanged="cbx_test1_SelectionChanged">
                <ComboBoxItem  >小明</ComboBoxItem  >
                <ComboBoxItem  >小王</ComboBoxItem  >
                <ComboBoxItem  >小陈</ComboBoxItem  >
            </ComboBox >

这里需要注意的是利用xaml的ComboBoxItem添加的成员,必须先转换为System .Windows .Controls .ComboBoxItem类型,然后调用Content属性才可以。

csharp 复制代码
   private void cbx_test1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string personName =((System .Windows .Controls .ComboBoxItem ) cbx_test1.SelectedItem).Content .ToString ();
            Console.WriteLine(personName);
        }

1.3.2 针对代码添加的元素

csharp 复制代码
 <ComboBox x:Name="cbx_test1" SelectedIndex=" 0"  SelectionChanged="cbx_test1_SelectionChanged">
               
            </ComboBox >
csharp 复制代码
  public MainWindow()
        {
            InitializeComponent();
            cbx_test1.Items.Add("小李");
            cbx_test1.Items.Add("小王");
            cbx_test1.Items.Add("小明");
        }

对于通过代码添加的成员,可以直接调用ToString ()

csharp 复制代码
   private void cbx_test1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string personName = cbx_test1.SelectedItem .ToString ();
            Console.WriteLine(personName);
        }

1.4 将ComboBox选中的值赋值给枚举类型的变量

csharp 复制代码
 <ComboBox x:Name="cbx_test1" SelectedIndex=" 0"  SelectionChanged="cbx_test1_SelectionChanged">
              
</ComboBox >

使用字符串转枚举将SelectedItem的值转换为枚举。

csharp 复制代码
  public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();
            cbx_test1.Items.Add("小李");
            cbx_test1.Items.Add("小王");
            cbx_test1.Items.Add("小明");
        }

        private void cbx_test1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            PersonName personName = (PersonName)Enum.Parse(typeof(PersonName), cbx_test1.SelectedItem.ToString());
        }
    }

    enum PersonName
    {
        小李,
        小王,
        小明
    }

2、MVVM模式下

2.1 将ComboBox选中的值赋值给string类型的变量

csharp 复制代码
 public  class ViewModelBase
    {

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propname)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propname));
            }
        }
    }
csharp 复制代码
 public class ViewModel : ViewModelBase
    {
        public ViewModel()
        {
            Items = new List<string>();
            Items.Add("分时1");
            Items.Add("分时2");
        }
        private List<string> items;
        
        public List<string> Items
        {
            get
            {
                return items;
            }
            set
            {
                this.items = value;
                OnPropertyChanged("Items");
            }
        }


        private string selectItem = "分时1";
        public string  SelectItem
        {
            get
            {
                return selectItem;
            }
            set
            {
                this.selectItem = value;
                OnPropertyChanged("SelectItem");
                Console.WriteLine(SelectItem);
            }
        }

    }
csharp 复制代码
  public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new ViewModel();
        }
    }

xaml界面代码

csharp 复制代码
 <ComboBox x:Name="cbx_test2" ItemsSource="{ Binding Path=Items}"  SelectedItem ="{Binding  SelectItem}">
            </ComboBox >

2.2 将ComboBox选中的值赋值给枚举类型的变量

这里使用ComboBox的SelectedIndex,由于需要绑定ViewModel中的枚举类型,但是这两个类型又不匹配,所以要加上类型转换。

csharp 复制代码
public class DivisionTypeToInt : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            DivisionType divisionType = (DivisionType)value;
            return (int)divisionType;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            int v = (int)value;
            DivisionType divisionType=DivisionType.Time1 ;
            switch (v)
            {
                case 0:
                    divisionType= DivisionType.Time1;
                    break;
                case 1:
                    divisionType= DivisionType.Time2;
                    break;
            }
            return divisionType;
        }
    }
csharp 复制代码
<Window x:Class="wpf之combox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpf之combox" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:DivisionTypeToInt x:Key="divisionTypeToInt"/>
    </Window.Resources>
    <Grid>
        <StackPanel >
            <ComboBox x:Name="cbx_test2" ItemsSource="{ Binding Path=Items}"  SelectedIndex="{Binding  divisionType, Converter={StaticResource divisionTypeToInt}}">
            </ComboBox >
        </StackPanel >
    </Grid>
</Window>
csharp 复制代码
 public  class ViewModelBase
    {

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propname)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propname));
            }
        }
    }
csharp 复制代码
public class ViewModel : ViewModelBase
    {
        public ViewModel()
        {
            Items = new List<string>();
            Items.Add("分时1");
            Items.Add("分时2");
        }
        private List<string> items;
        
        public List<string> Items
        {
            get
            {
                return items;
            }
            set
            {
                this.items = value;
                OnPropertyChanged("Items");
            }
        }


     


        private DivisionType _divisionType =DivisionType.Time1 ;
        public DivisionType divisionType
        {
            get
            {
                return _divisionType;
            }
            set
            {
                this._divisionType = value;
                OnPropertyChanged("divisionType");
            }
        }
    }
csharp 复制代码
  public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new ViewModel();
        }
    }

combox中有分时1、分时2两个选项。

相关推荐
beyond谚语4 小时前
第三章 布局
wpf
Aevget16 小时前
界面控件DevExpress WPF v25.1新版亮点:数据管理功能全新升级
.net·wpf·界面控件·devexpress·ui开发
baivfhpwxf202317 小时前
要在 WPF 中实现数据表对应实体的属性与 UI 控件的双向绑定,并支持修改通知和 UI 自动更新
c#·wpf
极客智造1 天前
深入解析 WPF 中的 DataTemplateSelector:动态模板选择的艺术
wpf
极客智造1 天前
WPF 高级 UI 定制:深入解析 VisualStateManager 与 Adorner
wpf
LateFrames3 天前
使用 Winform / WPF / WinUI3 / Electron 实现异型透明窗口
javascript·electron·wpf·winform·winui3
ifeng09183 天前
HarmonyOS实战项目:AI健康助手(影像识别与健康分析)
人工智能·华为·wpf·harmonyos
Aevget3 天前
界面控件Telerik UI for WPF 2025 Q3亮点 - 集成AI编码助手
人工智能·ui·wpf·界面控件·ui开发·telerik
张人玉3 天前
WPF 数据绑定与转换器详解
c#·wpf·light
主宰者3 天前
WPF CalcBinding简化判断逻辑
c#·.net·wpf