【MVVM Dev】多个具有依赖性质的ComboBox对数据的过滤
2017-02-19 13:29
453 查看
一、前言
在界面编程中,我们常常会遇到具有依赖性质的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[0]; } } } 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[0]; } } } 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[0]; } } } private string _DTypeSelected; public string DTypeSelected { get { return _DTypeSelected; } set { SetProperty(ref _DTypeSelected, value, () => DTypeSelected);
//在此处可以根据上述的ATypeSelected、BTypeSelected、CTypeSelected、DTypeSelected 对 TotalData 进行过滤从而得到想要显示在界面上的数据列表 } } }
相关文章推荐
- 正态分布具有很多好的性质,很多模型假设数据服从正态分布。但是如果数据不服从正态分布怎么办?
- 正态分布具有很多好的性质,很多模型假设数据服从正态分布。但是如果数据不服从正态分布怎么办?
- 过滤特定字符的文本框控件开发(具有特定数据类型的TextBox控件开发)
- easyui combobox 本地数据实现输入中文拼音简码过滤数据
- 【MVVM Dev】ComboBox嵌入CheckBox的显示问题
- DEV ImageComboBoxItem 绑定数据
- 正态分布具有很多好的性质,很多模型假设数据服从正态分布。但是如果数据不服从正态分布怎么办?
- 【MVVM Dev】DataColumn中的TextBox与ComboBox的并存
- DEV控件ComboBoxEdit附加下拉数据列方法(sqlhelper类自已找)
- C# 程序中如何向(DEV)ComboBoxEdit控件中添加下拉列表的值不使用数据绑定,就是使用代码添加
- JQuery easyUI combobox 数据过滤(filter)
- MVVM模式WPF的ComboBox数据绑定,使用Dictionary作为数据源
- c# 如何向comboBox中绑定数据库中指定的数据信息;
- ComboBox 绑定到数据表中一个列的问题
- c# combobox 数据绑定
- Scott Mitchell 的ASP.NET 2.0数据操作教程之八:使用两个DropDownList过滤的主/从报表
- Flex 使用ArrayCollection的FilterFunction进行数据过滤
- 创建可编辑的xml文档(之二) 过滤xml 数据
- Xaml中如何对ComboBox绑定一个数据集合
- [翻译] Scott Mitchell 的ASP.NET 2.0数据操作教程之七:使用DropDownList过滤的主/从报表