zoukankan      html  css  js  c++  java
  • 【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[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 进行过滤从而得到想要显示在界面上的数据列表 } } }
  • 相关阅读:
    《领域驱动设计的原则与实践》读书笔记(一)
    asp.net identity UserSecurityStamp 的作用
    Python Django Apache配置
    SQL语句优化(转载)
    【转】性能测试,影响 TPS 的一些因素
    【转】接口测试总结
    【转】两款 Web 前端性能测试工具
    【转】工作中使用Trepn Power Profiler的应用总结
    【转】nGrinder 简易使用教程
    Http协议状态码总结
  • 原文地址:https://www.cnblogs.com/lovecsharp094/p/6415591.html
Copyright © 2011-2022 走看看