023.WPF combox控件数据绑定

使用 MVVM 模式来绑定 ComboBox 数据是 WPF 应用程序中一种常见的做法。下面是一个简单的示例,演示如何使用 MVVM 模式实现 ComboBox 的数据绑定。

1. 创建 WPF 项目

首先,创建一个新的 WPF 应用程序项目。

2. 创建模型(Model)

在项目中,您可以创建一个简单的模型类(例如 chain_combox.cs),虽然在这个例子中我们可以直接使用字符串,但为了更好地展示 MVVM 的结构,可以定义一个模型:

cs 复制代码
 public class chain_combox
 {

		private int name;

		public int Name
		{
            get { return name; }
            set { name = value; }
		}

	}

3. 创建视图模型(ViewModel)

创建一个视图模型类(例如 MainViewModel.cs),这个类将去控制一个Chain子类方便代码管理

主控制类继承ObservableObject订阅通知类

cs 复制代码
 public class MainViewModel : ObservableObject
 {
    
     public Chain Mychain { get; }= new Chain();//链条数据类绑定
 }

4.写一个广播通知类ObservableObject

一般的mvvm包都会自带有ObservableObject这个工具类,不需要自己写工具类,但我的程序是用在旧项目上的 ,无法使用到工具包,所以需要自己封装这个广播通知类工具

cs 复制代码
 public class ObservableObject : INotifyPropertyChanged
 {
     public event PropertyChangedEventHandler PropertyChanged;

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
     {
         PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
     }

     protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
     {
         if (Equals(storage, value))
         {
             return false;
         }

         storage = value;
         OnPropertyChanged(propertyName);
         return true;
     }
 }

5.创建子控制器类Chain

cs 复制代码
using NXOpen.CAE;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UG_API.comboxs;

namespace UG_API.Models
{
    /// <summary>
    /// 链条数据类
    /// </summary>
    public class Chain : ObservableObject
    {
        //用ObservableCollection标签自动更新ITems
        private ObservableCollection<chain_combox> items;
        public ObservableCollection<chain_combox> Items
        {
            get => items;
            set => SetProperty(ref items, value); // 使用SetProperty通知更新
           
        }
        
        //定义成员属性,成员是每一个chain_combox模型类对象
        private chain_combox selectedItem;
        public chain_combox SelectedItem
        {
            get => selectedItem;
            set => SetProperty(ref selectedItem, value);// 使用SetProperty通知更新
        }

        //构造类似加载预先加载
        public Chain()
        {
            Items = new ObservableCollection<chain_combox>();

            // 使用循环加载从 8 到 114 的项
            for (int i = 8; i <= 114; i++)
            {
                Items.Add(new chain_combox { Name = i });
            }

            if (Items.Count > 0)
            {
                SelectedItem = Items[9]; // 设置默认选中项为第一个
            }
        }



    }
}

6.界面ui绑定

用主控制器的MyChain去调用子控制器的Items属性

XML 复制代码
<ComboBox 
    Name="combox7" 
    HorizontalAlignment="Left" 
    ItemsSource="{Binding Mychain.Items}" 
    SelectedItem="{Binding Mychain.SelectedItem, Mode=TwoWay}" 
    DisplayMemberPath="Name"
    Margin="276,32,0,0" VerticalAlignment="Top" Width="120"/>

7.在主窗体后台绑定主控制器

cs 复制代码
 public partial class HomePage : Window
 {
     MainViewModel home =new MainViewModel();    
     public HomePage()
     {
         InitializeComponent();
         this.DataContext = home;//数据绑定
     }
}

运行结果:成功加载了combox的项

二.为combox添加事件,获取选中项的值

要为 ComboBox 控件增加事件,以获取选中项的内容,您可以使用 SelectionChanged 事件。下面是如何在 WPF 中实现这一功能的步骤。

1. 更新 XAML 代码

MainWindow.xaml 中,您需要为 ComboBox 添加 SelectionChanged 事件处理程序。以下是更新后的 XAML 示例:

XML 复制代码
 <ComboBox Name="combox7" HorizontalAlignment="Left" ItemsSource="{Binding Mychain.Items}" 
            SelectedItem="{Binding SelectedItem, Mode=TwoWay}" 
            DisplayMemberPath="Name"
           SelectionChanged="combox7_SelectionChanged"
           Margin="276,32,0,0" VerticalAlignment="Top" Width="120"/>

2. 添加事件处理程序

MainWindow.xaml.cs 中,添加 ComboBox_SelectionChanged 事件处理程序,以获取并显示选中的项的内容:

cs 复制代码
 /// <summary>
 /// 选中的主链轮的齿数
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void combox7_SelectionChanged(object sender, SelectionChangedEventArgs e)
 {
     // 获取选中的项
     var comboBox = sender as System.Windows.Controls.ComboBox;
     if (comboBox != null)
     {
         var selectedItem = comboBox.SelectedItem as chain_combox;
         if (selectedItem != null)
         {
             MessageBox.Show(selectedItem.Name.ToString());
         }
     }
 }

运行结果:

相关推荐
Scout-leaf3 小时前
WPF新手村教程(七)—— 终章(MVVM架构初见杀)
c#·wpf
极客智造4 小时前
WPF DataGrid 多选绑定 + 强类型命令回调 通用解决方案
wpf
ZoeJoy84 小时前
机器视觉C# 调用相机:从 USB 摄像头到海康工业相机(WinForms & WPF)
数码相机·c#·wpf
ALex_zry21 小时前
C++高性能日志与监控系统设计
c++·unity·wpf
zhojiew1 天前
使用flink agent框架实现流式情感分析的示例
大数据·flink·wpf
海盗12341 天前
ScottPlot在WPF的基本使用和中文乱码问题
c#·.net·wpf
俄城杜小帅1 天前
C++线程异步和wpf中比较
java·c++·wpf
ZoeJoy81 天前
WPF 从入门到实践:基础、ModernUI 与 MVVM 完全指南
c#·wpf
△曉風殘月〆2 天前
WPF Prism中的MVVM实现
wpf·mvvm