【MVVM Dev】多个具有依赖性质的ComboBox对数据的过滤
一、前言
在界面编程中,我们常常会遇到具有依赖性质的ComboBox框,比如最常见的:
省/直辖市 => 地级市/区 => 区/街道
今天就说一下在WPF的MVVM模式中如何实现该功能
二、范例
假设有一段原始数据,名为:TotalData
其包含四个可以过滤的属性:AType、BType、CType、DType
与其对应的有四个ComboBox:
1. SelectedItem绑定:ATypeSelected ItemsSource绑定为:ATypes
2. SelectedItem绑定:BTypeSelected ItemsSource绑定为:BTypes
3. SelectedItem绑定:CTypeSelected ItemsSource绑定为:CTypes
4. SelectedItem绑定:DTypeSelected ItemsSource绑定为:DTypes
class Temp
{
private string _ATypeSelected;
public string ATypeSelected
{
get
{
return _ATypeSelected;
}
set
{
if (SetProperty(ref _ATypeSelected, value, () => ATypeSelected))
{
BTypes.Clear();
var BTempTypes = new List<string>(); if (ATypeSelected != "全部A类型" && ATypeSelected != null)
{
BTempTypes.AddRange(TotalData.Where(x => x.AType == ATypeSelected).Select(item => item.BType));
}
else
{
BTempTypes.AddRange(TotalData.Select(item => item.BType));
} BTypes.Add("全部B类型");
foreach (var item in BTempTypes.Distinct())
{
BTypes.Add(item);
}
BTypeSelected = BTypes[];
}
}
} private string _BTypeSelected;
public string BTypeSelected
{
get
{
return _BTypeSelected;
}
set
{
if (SetProperty(ref _BTypeSelected, value, () => BTypeSelected))
{
CTypes.Clear();
var CTempTypes = new List<string>(); if (ATypeSelected != "全部A类型" && ATypeSelected != null)
{
if (BTypeSelected != "全部B类型" && BTypeSelected != null)
{
CTempTypes.AddRange(from item in TotalData where item.AType == ATypeSelected && item.BType == BTypeSelected select item.CType);
}
else if (BTypeSelected == "全部B类型")
{
CTempTypes.AddRange(from item in TotalData where item.AType == ATypeSelected select item.CType);
}
}
else
{
if (BTypeSelected != "全部B类型" && BTypeSelected != null)
{
CTempTypes.AddRange(from item in TotalData where item.BType == BTypeSelected select item.CType);
}
else if (BTypeSelected == "全部B类型")
{
CTempTypes.AddRange(TotalData.Select(item => item.CType));
}
}
CTypes.Add("全部C类型");
foreach (var item in CTempTypes.Distinct())
{
CTypes.Add(item);
}
CTypeSelected = CTypes[];
}
}
} private string _CTypeSelected;
public string CTypeSelected
{
get
{
return _CTypeSelected;
}
set
{
if (SetProperty(ref _CTypeSelected, value, () => CTypeSelected))
{
DTypes.Clear();
var DTempTypes = new List<string>(); if (ATypeSelected != "全部A类型" && ATypeSelected != null)
{
if (BTypeSelected != "全部B类型" && BTypeSelected != null)
{
if (CTypeSelected != null && CTypeSelected != "全部C类型")
{
DTempTypes.AddRange(from item in TotalData where item.BType == BTypeSelected && item.CType == CTypeSelected && item.AType == ATypeSelected select item.DType);
}
else if (CTypeSelected == "全部C类型")
{
DTempTypes.AddRange(from item in TotalData where item.BType == BTypeSelected && item.AType == ATypeSelected select item.DType);
} }
else if (BTypeSelected == "全部B类型")
{
if (CTypeSelected != null && CTypeSelected != "全部C类型")
{
DTempTypes.AddRange(from item in TotalData where item.CType == CTypeSelected && item.AType == ATypeSelected select item.DType);
}
else if (CTypeSelected == "全部C类型")
{
DTempTypes.AddRange(from item in TotalData where item.AType == ATypeSelected select item.DType);
}
}
}
else
{
if (BTypeSelected != "全部B类型" && BTypeSelected != null)
{
if (CTypeSelected != null && CTypeSelected != "全部C类型")
{
DTempTypes.AddRange(from item in TotalData where item.BType== BTypeSelected && item.CType == CTypeSelected select item.DType);
}
else if (CTypeSelected == "全部C类型")
{
DTempTypes.AddRange(from item in TotalData where item.BType == BTypeSelected select item.DType);
} }
else if (BTypeSelected == "全部B类型")
{
if (CTypeSelected != null && CTypeSelected != "全部C类型")
{
DTempTypes.AddRange(from item in TotalData where item.CType == CTypeSelected select item.DType);
}
else if (CTypeSelected == "全部C类型")
{
DTempTypes.AddRange(TotalData.Select(item => item.DType));
}
}
} DTypes.Add("全部D类型");
foreach (var item in DTempTypes.Distinct())
{
DTypes.Add(item);
}
DTypeSelected = DTypes[];
}
}
} private string _DTypeSelected; public string DTypeSelected
{
get { return _DTypeSelected; }
set
{
SetProperty(ref _DTypeSelected, value, () => DTypeSelected);
//在此处可以根据上述的ATypeSelected、BTypeSelected、CTypeSelected、DTypeSelected 对 TotalData 进行过滤从而得到想要显示在界面上的数据列表 }
} }
【MVVM Dev】多个具有依赖性质的ComboBox对数据的过滤的更多相关文章
- 【MVVM DEV】DataColumn中的TextBox与ComboBox的并存
一.前言 在WPF编程中,有时候我们使用DataGrid会需要在一个DataColumn中既有TextBox,也要有ComboBox或者TextBlock等其他数据显示样式. 这个时候我们 ...
- 【MVVM Dev】PART_Editor的使用
一.前言 在日常的界面开发中,我们大多使用MVVM模式进行开发.通常情况下,一个PropertyGridControl或者DataGrid的ItemsSource设置好, 然后每一列绑定好 ...
- hdu-3449 Consumer---有依赖性质的背包
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3449 题目大意: fj打算去买一些东西,在那之前,他需要一些盒子去装他打算要买的不同的物品.每一个盒 ...
- 【MVVM Dev】ComboBox嵌入CheckBox的显示问题
一.前言 在ComboBox中嵌入若干个CheckBox时,当我们勾选一些CheckBox,ComboBox会显示相应的勾选项. 例如:CheckBox项有A,B,C 那么勾选这三项,ComboB ...
- 不依赖三方库从图像数据中获取宽高-gif、bmp、png、jepg
int extract_pic_info(const BYTE *pic, const uint32_t size, int &width, int &height) { ; widt ...
- 领域驱动和MVVM应用于UWP开发的一些思考
领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...
- WPF快速入门系列(8)——MVVM快速入门
一.引言 在前面介绍了WPF一些核心的内容,其中包括WPF布局.依赖属性.路由事件.绑定.命令.资源样式和模板.然而,在WPF还衍生出了一种很好的编程框架,即WVVM,在Web端开发有MVC,在WPF ...
- 基于MVVM的知乎日报应用安卓源码
使用data binding , dagger2 , retrofit2和rxjava实现的,基于MVVM的知乎日报APP运行效果: <ignore_js_op> 使用说明: 项目结构 a ...
- 浅析前端开发中的 MVC/MVP/MVVM 模式
MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...
随机推荐
- 【替罪羊树】bzoj3224&luogu3369&cogs1829 [Tyvj 1728]普通平衡树
[替罪羊树]bzoj3224&luogu3369&cogs1829 [Tyvj 1728]普通平衡树 bzoj 洛谷 cogs 先长点芝士 替罪羊树也是一种很好写的平衡树qwq..替罪 ...
- 前端--再遇jQuery
一.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回第一个属性) attr(属性名|属性值) --一个参数是获取属性的值,两个参数是设置属性值 --点击图片加载示例 removeAttr(属 ...
- Phaser3让超级玛丽实现轻跳、高跳及加上对应的跳跃声音
mario jumper 在线测试地址:http://www.ifiero.com/uploads/phaserjs3/jumper/ 空格键:轻按:跳低 ,长按:跳高键盘:--> 向右 , ...
- CentOS7.x安装Docker1.11.1
原文发表于cu:2016-05-30 本文属于重发,当前Docker已经分为EE与CE版本,CE版本是17.06.0-ce,最新的CE版本安装方式已略有不同:但可以指定安装版本,如1.11.1,1.1 ...
- PytorchZerotoAll学习笔记(五)--逻辑回归
逻辑回归: 本章内容主要讲述简单的逻辑回归:这个可以归纳为二分类的问题. 逻辑,非假即真.两种可能,我们可以联想一下在继电器控制的电信号(0 or 1) 举个栗子:比如说你花了好几个星期复习的考试(通 ...
- HttpServlet 详解(基础)
HttpServlet详解 大家都知道Servlet,但是不一定很清楚servlet框架,这个框架是由两个Java包组成:javax.servlet和javax.servlet.http. 在java ...
- curl和file_get_contents 区别以及各自的优劣
PHP中fopen,file_get_contents,curl函数的区别: 1.fopen /file_get_contents 每次请求都会重新做DNS查询,并不对 DNS信息进行缓存.但是CUR ...
- moment.js学习总结
一. 介绍: moment.js不依赖任何第三方库,支持字符串.Date.时间戳以及数组等格式,可以像PHP的date()函数一样,格式化日期时间,计算相对时间,获取特定时间后的日期时间等等.下面是一 ...
- 把字符串"3,1,2,4"以","分割拆分为数组,数组元素并按从小到大的顺序排列
package com.wangcf; /** * 把字符串"3,1,2,4"以","分割拆分为数组,数组元素并按从小到大的顺序排列 * @author fan ...
- textarea中文提交乱码问题解决
在A.jsp中有如下语句: <textarea rows="10" cols="30" name="texts"><%=r ...