使用 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());
}
}
}
运行结果:
