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模式)的更多相关文章

  1. WPF中常用控件(TreeView, ComboBox, DataGrid, ListView)使用MVVM模式绑定的demo

    之前几篇关于TreeView的博客中只是贴了源代码,并没有把整个项目上传到github.最近就想着把我常用的几个控件做成一个demo,这样也方便自己以后查看.本人也是WPF新手,但是我并没有打算就往这 ...

  2. WPF MVVM模式下ComboBox级联效果 选择第一项

    MVVM模式下做的省市区的级联效果.通过改变ComboBox执行命令改变市,区. 解决主要问题就是默认选中第一项 1.首先要定义一个属性,继承自INotifyPropertyChanged接口.我这里 ...

  3. MVVM模式和在WPF中的实现(二)数据绑定

    MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  4. kendo-ui的MVVM模式

    摘要: MVVM(Model View ViewModel)是一种帮助开发者将数据从模型分离的设计模式.MVVM的ViewModel负责将数据对象从模型中分离出来,通过这种方式数据就很容易控制数据如何 ...

  5. MVVM模式的 数据绑定

    数据绑定要达到的效果 数据绑定要达到什么效果呢,就是在界面中绑定了数据源之后,数据在界面上的修改能反映到绑定源,同时绑定源的修改也能反映到界面上.从界面反映到绑定的数据源是很容易理解的,因为在绑定过程 ...

  6. MVVM模式的几个开源框架

    原文:MVVM模式的几个开源框架 实现MVVM的框架有很多,如: • MVVM Light Toolkit: http://mvvmlight.codeplex.com • Microsoft Pri ...

  7. [转载]MVVM模式原理分析及实践

    没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...

  8. 转:界面之下:还原真实的 MVC、MVP、MVVM 模式

    前言 做客户端开发.前端开发对MVC.MVP.MVVM这些名词不了解也应该大致听过,都是为了解决图形界面应用程序复杂性管理问题而产生的应用架构模式.网上很多文章关于这方面的讨论比较杂乱,各种MV*模式 ...

  9. MVP模式和MVVM模式

    MVP模式 模型-视图-表示器,也就是MVP模式.是mvc模式的一种衍生模式,专注于改进表示逻辑. 与MVC不同,来自view的调用将委托给presenter(表示器),表示器通过接口与view对话. ...

随机推荐

  1. 干了8年Android开发熬到年薪40万,突然接到被辞退消息,应该怎么办?

    01 36岁Android开发,为公司工作8年,昨天HR说公司不准备续约 前天晚上,有个读者给我留言,讲述了他自己比较气愤的一件事,感觉自己委屈又不值. 这位朋友不愿意透露姓名,就叫他H先生吧. H先 ...

  2. finalize() 方法——Java中垃圾回收提醒方法

    finalize() Java 允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做 finalize( ),它用来清除回收对象. 例如,你可以使用 finalize() 来确保 ...

  3. Linux下使用pure-ftpd建立匿名ftp访问

    by 无若 (一)ubuntu14.04下使用pure-ftpd建立匿名ftp访问 1.安装apt-get install pure-ftpd 2.修改配置nano /etc/pure-ftpd/co ...

  4. Kong网关安装之Docker版(1)

    前言: Kong 是天生的微服务网关.她的官方简介是:Kong 是一个云原生,高效,可扩展的分布式 API 网关. 自 2015 年在 github 开源后,广泛受到关注,目前已收获 1.9w+ 的 ...

  5. Linux应用程序安装方法

    一.linux应用程序基础 1.1.应用程序与系统命令的关系 1.2.典型应用程序的目录结构 1.3.常见的软件包封装类型 二.RPM包管理工具 2.1.RPM软件包管理器Red-Hat Packag ...

  6. 详细讲讲netty的pipiline!

    前言 提到 Netty 首当其冲被提起的肯定是支持它承受高并发的线程模型,说到线程模型就不得不提到 NioEventLoopGroup 这个线程池,接下来进入正题. 线程模型 首先来看一段 Netty ...

  7. 授予mysql的其他用户数据库的使用权限

    场景:不同的开发人员有不同的数据库的权限:也可适用于外包公司不同的开发权限. root用户登录数据库,命令行执行下面语句即可. grant select,delete,update,create,dr ...

  8. Shell-06-正则表达式

    正则表达式 shell正则表达式分为两种 基础正则表达式:BRE 扩展正则表达式:ERE,扩展的表达式有 + .? .| 和 () 元字符表 * 匹配0次或多次 更多请查看相关网站 http://ww ...

  9. 【原创】利用“进程注入”实现无文件不死webshell

    引子 上周末,一个好兄弟找我说一个很重要的目标shell丢了,这个shell之前是通过一个S2代码执行的漏洞拿到的,现在漏洞还在,不过web目录全部不可写,问我有没有办法搞个webshell继续做内网 ...

  10. python脚本监控股票价格钉钉推送

    关注股市,发家致富 问题:一天天盯着股市多累,尤其上班,还不能暴露,股票软件,红红绿绿,这么明显的列表页面,一看就知道在摸鱼.被领导发现饭碗就没了 解决:搞个脚本监听一下自己关注的股票,一到价格就发个 ...