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

相关推荐
暖馒9 小时前
Modbus应用层协议的深度剖析
网络·网络协议·c#·wpf·智能硬件
R1nG86311 小时前
HCCL vs NCCL代码级对比 hccl/algorithms/ vs nccl/src/collectives/ Ring算法实现差异
wpf·cann
风指引着方向15 小时前
归约操作优化:ops-math 的 Sum/Mean/Max 实现
人工智能·wpf
听麟18 小时前
HarmonyOS 6.0+ 跨端智慧政务服务平台开发实战:多端协同办理与电子证照管理落地
笔记·华为·wpf·音视频·harmonyos·政务
听麟1 天前
HarmonyOS 6.0+ APP AR文旅导览系统开发实战:空间定位与文物交互落地
人工智能·深度学习·华为·ar·wpf·harmonyos
聆风吟º2 天前
CANN hccl 深度解析:异构计算集群通信库的跨节点通信与资源管控实现逻辑
人工智能·wpf·transformer·cann
无心水2 天前
分布式定时任务与SELECT FOR UPDATE:从致命陷阱到优雅解决方案(实战案例+架构演进)
服务器·人工智能·分布式·后端·spring·架构·wpf
LZL_SQ2 天前
HCCL测试框架中AllReduce边界条件测试设计深度剖析
wpf·cann
User_芊芊君子3 天前
【分布式训练】CANN SHMEM跨设备内存通信库:构建高效多机多卡训练的关键组件
分布式·深度学习·神经网络·wpf
就是有点傻4 天前
WPF按钮走马灯效果
wpf