Wpf Prism实现省市县ComboBox级联

        因一个小项目被要求用wpf实现,在这之前没使用过wpf,有些东西的实现方式不甚了解,只能一边摸索学习一边写代码。正好其中有一个省市县级联的需求,百度了一圈也没找到满足需要的,于是自己动手实现了下。在这里整理记录下实现过程,做个备忘。

先看效果

Wpf Prism实现省市县ComboBox级联_第1张图片

 view  xaml代码

        把省份的ItemsSource绑定ProvinceList,然后给城市的ItemsSource绑定到ElementName=省的SelectedItem上,同样县区的ItemsSource绑定到ElementName=市的SelectedItem上。


    
        
            
            
            
        
        
            
                
                
                
                
                
                
            
            
            
            
            
            
            
        
        
            
                
                
                
            
            
            
        
    

viewmodel代码

        首先定义三个类,分别表示省、市、县三级。除了各自都有Name属性外,其中省中包含了市的list,市中包含了县的list。

/// 
/// 县/区
/// 
public class County
{
    public string Name { get; set; }
}
/// 
/// 市
/// 
public class City
{
    public string Name { get; set; }
    public List Countys { get; set; }
}

/// 
/// 省
/// 
public class Province
{
    public string Name { get; set; }
    public List Citys { get; set; }
}

        定义一个ProvinceList用于ItemsSource绑定,并通过InitData方法对ProvinceList进行赋值。这里省市县数据通过网上下载的一个xml充当数据源。


public List ProvinceList { set; get; }

public MainWindowViewModel()
{
     InitData();
}

/// 
/// 初始化数据
/// 
void InitData()
{
    XmlDocument doc = new XmlDocument();
    string path= ".\\ProvinceCode.xml";
    XmlNodeList cities, counties = null;

    doc.Load(path);

    XmlNode provinces = doc.SelectSingleNode("/root");

    ProvinceList = new List();
    Province p = new Province();
    City c = new City();
    County a = new County();

    foreach (XmlNode province in provinces.ChildNodes)
    {
        p = new Province();
        p.Name = province.Attributes["Name"].Value;

        path= string.Format("root/Province[@Name='{0}']/City", province.Attributes["Name"].Value);
        cities = doc.SelectNodes(path);

        p.Citys = new List();
        foreach (XmlNode city in cities)
        {
            c = new City();
            c.Name = city.Attributes["Name"].Value;

            a = new County();
            path = string.Format("root/Province[@Name='{0}']/City[@Name='{1}']/County",
                                 province.Attributes["Name"].Value, city.Attributes["Name"].Value);

            c.Countys = new List();
            counties = doc.SelectNodes(path);
            if (counties.Count == 0)
            {
                a.Name = "--请选择--";
                c.Countys.Add(a);
            }
            else
            {
                foreach (XmlNode county in counties)
                {
                    a = new County();
                    a.Name = county.Attributes["Name"].Value;
                    c.Countys.Add(a);
                }
            }
            p.Citys.Add(c);
        }
        ProvinceList.Add(p);
    }
}

        至此已实现了wpf的省市县的级联,接下来要取到想要的数据,需求还有要取到每个市的区号,也很简单。

private DelegateCommand _GetData = null;
public DelegateCommand GetData => _GetData ?? (_GetData = new DelegateCommand(GetData_Click));

void GetData_Click()
{
    if (County == "")
    {
        txtData = "请先选择省、市、县";
        return;
    }
    string targetParm = string.Format("root/Province/City[@Name='{0}']", City);//
    XmlDocument doc = new XmlDocument();
    string path= ".\\ProvinceCode.xml";
    doc.Load(path);

    XmlNode targetNode = doc.SelectSingleNode(targetParm);

    string areacode = targetNode.Attributes["areacode"].Value;

    txtData = string.Format("省份:{0},城市:{1},县/区:{2},区号:{3}", Province, City, County, areacode);
}

完整代码下载

你可能感兴趣的:(wpf,c#)