当前位置: 首页 > news >正文

wpf之ListBox

前言

wpf中ListBox在针对多个选项选择中的应用十分广泛,本文就来讲解非Mvvm和Mvvm模式下如何使用ListBox。

1、非MVVM模式下

xaml代码:
ListBoxItem用于存储ListBox的每一项,可以设置ListBoxItem的属性,比如Foreground控制项的字体颜色;Background来控制项的背景色;为ListBox注册SelectionChanged事件,该事件代码在MainWindow窗体类中。

 <ListBox x:Name="ListBox_test" SelectionChanged="ListBox_SelectionChanged"><ListBoxItem Foreground="White"  Background="Red"   >项目1</ListBoxItem><ListBoxItem>项目2</ListBoxItem><ListBoxItem>项目3</ListBoxItem><ListBoxItem>项目4</ListBoxItem></ListBox >

MainWindow窗体类

 public partial class MainWindow : Window{public MainWindow(){InitializeComponent();this.DataContext = new ViewModel();}private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e){var item = ListBox_test.SelectedItem;}}

运行结果:
在这里插入图片描述

2、MVVM模式下

2.1 SelectionMode为Single

xaml代码:
1)mvvm模式下使用绑定来为ListBox添加数据,通过为ItemsSource绑定ViewModel中的Items属性
2)然后为了获取ListBox中用户选择的哪一项,为SelectedItem绑定ViewModel中的divisionType属性
但是由于SelectedItem是object类型,divisionType是枚举类型,无法直接绑定,所以要使用类型转换

<Window.Resources><local:DivisionTypeToString x:Key="DivisionTypeToString"/></Window.Resources><ListBox SelectionMode="Single" ItemsSource="{Binding Items }" Foreground="Red"  SelectedItem="{Binding divisionType, Converter={StaticResource DivisionTypeToString}}"  > </ListBox >

添加类型转换
下面的Convert方法用于将DivisionType转换成字符串,ConvertBack用于将字符串转换成DivisionType

 public  class DivisionTypeToString: IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){DivisionType divisionType = (DivisionType)value;return divisionType.ToString ();}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){DivisionType divisionType  =(DivisionType)Enum.Parse(typeof (DivisionType),value .ToString ());return divisionType;}}

添加 Model类

public enum DivisionType
{分时1,分时2
}

添加ViewModelBase类

 public class ViewModelBase{public event PropertyChangedEventHandler PropertyChanged;public void OnPropertyChanged(string propname){if (PropertyChanged != null){PropertyChanged(this, new PropertyChangedEventArgs(propname));}}}

添加ViewModel类

 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.分时1;public DivisionType divisionType{get{return _divisionType;}set{this._divisionType = value;OnPropertyChanged("divisionType");}}}

运行结果:
在这里插入图片描述

2.2 SelectionMode为Multiple

xaml代码:
1)mvvm模式下使用绑定来为ListBox添加数据,通过为ItemsSource绑定ViewModel中的Items属性
2)又因为是多选,所以不能使用SelectedItem属性的绑定,得使用 SelectionChanged事件,然后在事件中获取SelectedItems属性从而获取所有用户选择的项,所以这里使用使用Interaction.Trigger,EventName指定绑定的事件名称,CommandSelectionChanged是绑定的ViewModel中的命令。(这里要注意使用Interaction.Triggers需要引用System.Windows.Interactivity.dll)

<Window.Resources><local:DivisionTypeToString x:Key="DivisionTypeToString"/></Window.Resources><ListBox x:Name="listBox_test2" SelectionMode="Multiple" ItemsSource="{Binding Items }" Foreground="Red"     ><Event:Interaction.Triggers><Event:EventTrigger EventName="SelectionChanged"><Event:InvokeCommandAction Command="{Binding CommandSelectionChanged}" CommandParameter="{Binding ElementName=listBox_test2}"/></Event:EventTrigger></Event:Interaction.Triggers></ListBox >

添加DelegateCommand

 public class DelegateCommand : ICommand{private readonly Action<object> _execute;private readonly Func<object, bool> _canExecute;public DelegateCommand(Action<object> execute, Func<object, bool> canExecute = null){_execute = execute ?? throw new ArgumentNullException(nameof(execute));_canExecute = canExecute;}public bool CanExecute(object parameter){if (_canExecute != null){return _canExecute(parameter);}else{return true;}}public void Execute(object parameter){_execute(parameter);}public event EventHandler CanExecuteChanged{add => CommandManager.RequerySuggested += value;remove => CommandManager.RequerySuggested -= value;}public void RaiseCanExecuteChanged(){CommandManager.InvalidateRequerySuggested();}}

添加 Model类

public enum DivisionType
{分时1,分时2
}

添加ViewModelBase类

 public class ViewModelBase{public event PropertyChangedEventHandler PropertyChanged;public void OnPropertyChanged(string propname){if (PropertyChanged != null){PropertyChanged(this, new PropertyChangedEventArgs(propname));}}}

添加ViewModel类

 public class ViewModel : ViewModelBase{public ICommand CommandSelectionChanged { get; set; }public ViewModel(){Items = new List<string>();Items.Add("分时1");Items.Add("分时2");CommandSelectionChanged = new DelegateCommand(ListBoxSelectionChanged);}private List<string> items;public List<string> Items{get{return items;}set{this.items = value;OnPropertyChanged("Items");}}private ObservableCollection<DivisionType> _divisionTypeList = new ObservableCollection<DivisionType>();public ObservableCollection<DivisionType> divisionTypeList{get{return _divisionTypeList;}set{this._divisionTypeList = value;OnPropertyChanged("divisionTypeList");}}private void ListBoxSelectionChanged(object obj){divisionTypeList.Clear();ListBox listBox =(ListBox) obj;foreach ( var item in listBox.SelectedItems){DivisionType divisionType=(DivisionType) Enum.Parse(typeof (DivisionType),item.ToString ());divisionTypeList.Add(divisionType);}}}

运行结果:
在这里插入图片描述

马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)

1、《C#串口通信从入门到精通》
2、《C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》
7、《C#操作MySql数据库从入门到精通》

http://www.dtcms.com/a/354735.html

相关文章:

  • 一个客户端直接掉线或断点,服务器怎么快速识别
  • 通过代码认识 CNN:用 PyTorch 实现卷积神经网络识别手写数字
  • audioMAE模型代码分析
  • 循环神经网络——pytorch实现循环神经网络(RNN、GRU、LSTM)
  • 深度学习——卷积神经网络(PyTorch 实现 MNIST 手写数字识别案例)
  • SpringBoot项目使用Liquibase 数据库版本管理
  • Day16_【机器学习—KNN算法】
  • IDA Pro 逆向分析快捷键大全及核心用法详解
  • 【Day 35】Linux-Mysql错误总结
  • 微信小程序对接EdgeX Foundry详细指南
  • 导入文件允许合并表格
  • 上海控安:汽车API安全-风险与防护策略解析
  • Elasticsearch数据迁移方案深度对比:三种方法的优劣分析
  • 领悟8种常见的设计模式
  • 74HC595芯片简析
  • OpenCV 基础操作实战指南:从图像处理到交互控制
  • Ubuntu有限网口无法使用解决方法
  • 企业级AI应用场景的核心特征
  • Fluent Bit针对kafka心跳重连机制详解(上)
  • DA14531(Cortex-M0+)之Wake-up Interrupt Controller (WIC)
  • JumpServer开源堡垒机:统一访问入口 + 安全管控 + 操作审计
  • 从0开始搭建一个前端项目(vue + vite + typescript)
  • 第6篇:链路追踪系统 - 分布式环境下的请求跟踪
  • 【STM32】G030单片机的窗口看门狗
  • 从协作机器人到智能协作机器人:工业革命的下一跳
  • Fluent Bit针对kafka心跳重连机制详解(下)
  • KubeBlocks For MySQL 云原生设计分享
  • Logstash数据迁移之mysql-to-kafka.conf详细配置
  • 卷积神经网络(CNN)搭建详解
  • 区块链+隐私计算护航“东数西算”数据安全报告