多选Combobox的实现(适合MVVM模式)
MVVM没有.cs后台逻辑,一般依靠command驱动逻辑及通过binding(vm层的属性)来显示前端
我的数据类Student有三个属性int StuId ,string StuName ,bool isChecked。
首先第一步创建一个UserControl,里面放一个ComboBox
<ComboBox x:Name="cb" Width="150" Height="25" ItemsSource="{Binding StudentList}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox Click="CheckBox_Click" IsChecked="{Binding IsChecked,Mode=TwoWay}"/>
                        <TextBlock Text="{Binding StuName}"/>
                    </StackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
ComboBox 的样式改造如前篇非MvvM模式下的改造一样,只要将template中ContentPresenter的Content="{TemplateBinding SelectionBoxItem}"改成Content="{TemplateBinding Tag}"即可。
然后在UserControl.cs里加一个依赖属性
public List<Student> SelectedItems1
        {
            get { return (List<Student>)GetValue(SelectedItems1Property); }
            set { SetValue(SelectedItems1Property, value); }
        }
public static readonly DependencyProperty SelectedItems1Property =
            DependencyProperty.Register("SelectedItems1", typeof(List<Student>), typeof(ComboboxEx),new PropertyMetadata(null,new PropertyChangedCallback(OnSelectedChangeCallBack)));
private static void OnSelectedChangeCallBack(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            MessageBox.Show("Success");
        }
这里在回调函数中做了个弹出框的处理,用来判断属性绑定是否成功。
勾选框的逻辑处理:
private void CheckBox_Click(object sender, RoutedEventArgs e)
        {
            var items = this.cb.ItemsSource ;
if (items != null )
            {
                SelectedStr=string.Empty;
                foreach (Student item in items)
                {
                    if (item.IsChecked == true)
                    {
                        SelectedStr = string.Format("{0}{1};", SelectedStr, item.StuName);
                    }
                }
this.cb.Tag = SelectedStr;
            }
        }
第二步,建立ViewModel层
里面创建两个属性,一个用来创建数据源集合,一个用来存放勾选的集合
public ObservableCollection<Student> StudentList{get;set;}
private List<Student> _SelectedItems;
public List<Student> SelectedItems
        {
            get { return _SelectedItems; }
            set
            {
                if (PropertyChanged != null)
                {
                    _SelectedItems = value;
                    this.PropertyChanged(this, new PropertyChangedEventArgs("SelectedItems"));
                }  
            }
        }
建立一个command及一个遍历方法
public ICommand CheckItemsChangedCommand { get; set; }
public void UpdataSelecteditems()
        {
            List<Student> slist = new List<Student>();
            foreach (var item in StudentList)
            {
                if (item.IsChecked == true)
                {
                    slist.Add(item);
                }
            }
            SelectedItems = slist;
        }
在ViewModel构造函数中绑定数据集合,实例化Command;
public ComboboxViewModel()
        {
            SelectedItems = new List<Student>();
StudentList = new ObservableCollection<Student>()
            {
                new Student(){StuId=1,StuName="aaa"},
                new Student(){StuId=2,StuName="bbb"},
                new Student(){StuId=3,StuName="ccc"},
                new Student(){StuId=3,StuName="ddd"},
                new Student(){StuId=3,StuName="eee"}
            };
CheckItemsChangedCommand = new ActionCommand(this.UpdataSelecteditems);
}
最后一步完成部件的组装
<StackPanel>
            <UserControls:ComboboxEx x:Name="cb" SelectedItems1="{Binding SelectedItems}"></UserControls:ComboboxEx>
            <Button HorizontalAlignment="Center" Content="Click" Command="{Binding CheckItemsChangedCommand}"/>
        </StackPanel>
后台加 this.DataContext = new ComboboxViewModel();
(PS:当在Selecte ComboboxItem而非Check的时候,combobox head会显示checkbox。这里要重现ComboboxItem的onMouseLeftUp事件,里面改成e.handle =true即可)
多选Combobox的实现(适合MVVM模式)的更多相关文章
- WPF中常用控件(TreeView, ComboBox, DataGrid, ListView)使用MVVM模式绑定的demo
		之前几篇关于TreeView的博客中只是贴了源代码,并没有把整个项目上传到github.最近就想着把我常用的几个控件做成一个demo,这样也方便自己以后查看.本人也是WPF新手,但是我并没有打算就往这 ... 
- WPF MVVM模式下ComboBox级联效果 选择第一项
		MVVM模式下做的省市区的级联效果.通过改变ComboBox执行命令改变市,区. 解决主要问题就是默认选中第一项 1.首先要定义一个属性,继承自INotifyPropertyChanged接口.我这里 ... 
- MVVM模式和在WPF中的实现(二)数据绑定
		MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ... 
- kendo-ui的MVVM模式
		摘要: MVVM(Model View ViewModel)是一种帮助开发者将数据从模型分离的设计模式.MVVM的ViewModel负责将数据对象从模型中分离出来,通过这种方式数据就很容易控制数据如何 ... 
- MVVM模式的 数据绑定
		数据绑定要达到的效果 数据绑定要达到什么效果呢,就是在界面中绑定了数据源之后,数据在界面上的修改能反映到绑定源,同时绑定源的修改也能反映到界面上.从界面反映到绑定的数据源是很容易理解的,因为在绑定过程 ... 
- MVVM模式的几个开源框架
		原文:MVVM模式的几个开源框架 实现MVVM的框架有很多,如: • MVVM Light Toolkit: http://mvvmlight.codeplex.com • Microsoft Pri ... 
- [转载]MVVM模式原理分析及实践
		没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ... 
- 转:界面之下:还原真实的 MVC、MVP、MVVM 模式
		前言 做客户端开发.前端开发对MVC.MVP.MVVM这些名词不了解也应该大致听过,都是为了解决图形界面应用程序复杂性管理问题而产生的应用架构模式.网上很多文章关于这方面的讨论比较杂乱,各种MV*模式 ... 
- MVP模式和MVVM模式
		MVP模式 模型-视图-表示器,也就是MVP模式.是mvc模式的一种衍生模式,专注于改进表示逻辑. 与MVC不同,来自view的调用将委托给presenter(表示器),表示器通过接口与view对话. ... 
随机推荐
- 我把阿里、腾讯、字节跳动、美团等Android性能优化实战整合成了一个PDF文档
			安卓开发大军浩浩荡荡,经过近十年的发展,Android技术优化日异月新,如今Android 11.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS. 但是,到了各大厂商手 ... 
- tkinter  基础教程
			目录 介绍 模块 导入方式 API 使用 主窗口 运行窗口 组件列表介绍 Label 标签 Button 按钮 Options 属性选项 文本框 Entry 单行文本框 Text 多行文本框 文本框属 ... 
- rancher清理主机脚本
			#!/bin/bash #From:rancher #date:2019-10-18 #admin:jarno # 停止服务 systemctl disable kubelet.service sys ... 
- 使用vimdiff做hg的版本比较工具
			gvim的文本比较功能很强,命令行用法:gvim -d file1 file2,hg自带的hg diff没有颜色标示,含义也不够清晰,所以需要用vim的diff代替它,实现方法是在全局配置文件中增加: ... 
- SQL 练习11
			查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息 SELECT * from Student WHERE SId in (SELECT SId from sc WHE ... 
- SQL 练习2
			查询同时存在" 01 "课程和" 02 "课程的情况 分析:分别先查询出包含有01课程和02课程 SELECT * from sc WHERE cid='01' ... 
- NLP与深度学习(一)NLP任务流程
			1. 自然语言处理简介 根据工业界的估计,仅有21% 的数据是以结构化的形式展现的[1].在日常生活中,大量的数据是以文本.语音的方式产生(例如短信.微博.录音.聊天记录等等),这种方式是高度无结构化 ... 
- Ztree 树插件 树节点名称太长的解决方案
			样式允许的情况下 给背景div加滚动条.. 或者使用省略号方法:使用addDiyDom http://blog.csdn.net/zhengbo0/article/details/17759543 ... 
- 原来:HTTP可以复用TCP连接
			问题 线上的一个项目会和微信服务器有API请求(目的是获取用户的微信信息),但会有偶发的报错: 'Connection aborted.', ConnectionResetError(104, 'Co ... 
- jekins
			上面是:maven配置 git安装: 容器安装: 容器配置与发布: 添加安全认证(如果tomcat没有设置密码这里也不需要设置:) 访问尝试:本地测试前置practice_war的影响 Jekins实 ... 
