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两个选项。

相关推荐
△曉風殘月〆13 小时前
如何在WPF中捕获窗口外的事件
wpf
爱吃烤鸡翅的酸菜鱼2 天前
Java 事件发布-订阅机制全解析:从原生实现到主流中间件
java·中间件·wpf·事件·发布订阅
武藤一雄3 天前
WPF中ViewModel之间的5种通讯方式
开发语言·前端·microsoft·c#·wpf
CSharp精选营3 天前
都是微软亲儿子,WPF凭啥干不掉WinForm?这3个场景说明白了
c#·wpf·跨平台·winform
baivfhpwxf20233 天前
wpf TextBlock 控件如何根据内容换行?
wpf
亘元有量-流量变现3 天前
鸿蒙、安卓、苹果音频设备技术深度解析与开发实践
android·wpf·harmonyos·亘元有量·积分墙
软泡芙3 天前
【Bug】ReactiveUI WPF绑定中依赖属性不更新的问题分析与解决方案
java·bug·wpf
浪扼飞舟3 天前
WPF输入验证(ValidationRule)
java·javascript·wpf
IOFsmLtzR5 天前
Flink Agents 源码解读 --- (5) --- ActionExecutionOperator
microsoft·flink·wpf
廋到被风吹走6 天前
【AI】Codex 复杂任务拆解:从“一气呵成“到“步步为营“
人工智能·wpf