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

相关推荐
没有bug.的程序员3 小时前
微服务中的数据一致性困局
java·jvm·微服务·架构·wpf·电商
Aevget3 小时前
DevExpress WPF中文教程:Data Grid - 如何绑定到有限制的自定义服务(二)?
wpf·devexpress·.net 10·data grid
没有bug.的程序员2 天前
SOA、微服务、分布式系统的区别与联系
java·jvm·微服务·架构·wpf·日志·gc
Macbethad2 天前
基于WPF的半导体设备配方管理程序技术方案
wpf
FuckPatience2 天前
WPF Geometry
wpf
武藤一雄3 天前
.NET 中常见计时器大全
microsoft·微软·c#·.net·wpf·.netcore
MarkHD3 天前
车辆TBOX科普 第70次 AUTOSAR Adaptive、容器化与云原生的融合革命
云原生·wpf
极客智造3 天前
WPF Behavior 实战:自定义 InvokeCommandAction 实现事件与命令解耦
wpf
L、2183 天前
Flutter 与 OpenHarmony 深度集成:构建分布式多端协同应用
分布式·flutter·wpf
布伦鸽3 天前
C# WPF -MaterialDesignTheme 找不到资源“xxx“问题记录
开发语言·c#·wpf