首先在绑定的时候进行转换:

  public class RegionConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var name = value as string;
var filter = parameter as string;
if (string.IsNullOrEmpty(name) && filter != "country")
{
return null;
}
var provider = new XmlDataProvider();
provider.Source = new Uri("Resources/Region.xml", UriKind.Relative);
if (filter == "country")
{
provider.XPath = "/region/country/@name";
}
else if (filter == "province")
{
provider.XPath = string.Format("/region/country[@name='{0}']/province/@name", name);
}
else if (filter == "city")
{
provider.XPath = string.Format("/region/country/province[@name='{0}']/city/@name", name);
}
else if (filter == "town")
{
provider.XPath = string.Format("/region/country/province/city[@name='{0}']/town/@name", name);
}
return provider;
} public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

再看以下如何绑定的

 <converters:RegionConverter x:Key="region"/>
  <ComboBox Grid.Column="" x:Name="country"
DataContext="{Binding Converter={StaticResource region}, ConverterParameter=country}"
SelectedValue="{Binding DataContext.CurrEditorItem.Country,UpdateSourceTrigger=PropertyChanged,
RelativeSource={RelativeSource AncestorType={x:Type mui:ModernWindow}}}"
ItemsSource="{Binding}"
Width="" Style="{StaticResource CommonComboBoxStyle}" />
<ComboBox Grid.Column="" x:Name="province"
DataContext="{Binding SelectedValue, ElementName=country, Converter={StaticResource region}, ConverterParameter=province}"
SelectedValue="{Binding DataContext.CurrEditorItem.Province,UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource AncestorType={x:Type mui:ModernWindow}}}"
ItemsSource="{Binding}"
Width="" Style="{StaticResource CommonComboBoxStyle}" />
<ComboBox Grid.Column="" x:Name="city"
DataContext="{Binding SelectedValue, ElementName=province, Converter={StaticResource region}, ConverterParameter=city}"
SelectedValue="{Binding DataContext.CurrEditorItem.City,UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource AncestorType={x:Type mui:ModernWindow}}}"
ItemsSource="{Binding}"
Width="" Style="{StaticResource CommonComboBoxStyle}" />
<ComboBox Grid.Column="" x:Name="town"
DataContext="{Binding SelectedValue, ElementName=city, Converter={StaticResource region}, ConverterParameter=town}"
SelectedValue="{Binding DataContext.CurrEditorItem.Area,UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource AncestorType={x:Type mui:ModernWindow}}}"
ItemsSource="{Binding}" Text="{Binding Area,UpdateSourceTrigger=PropertyChanged}"
Width="" Style="{StaticResource CommonComboBoxStyle}" />
<TextBlock Grid.Column="" Text="国家" Tag="{Binding SelectedValue, ElementName=country}"
Style="{StaticResource TipTextBlock}"/>
<TextBlock Grid.Column="" Text="省份" Tag="{Binding SelectedValue, ElementName=province}"
Style="{StaticResource TipTextBlock}"/>
<TextBlock Grid.Column="" Text="市/区" Tag="{Binding SelectedValue, ElementName=city}"
Style="{StaticResource TipTextBlock}"/>
<TextBlock Grid.Column="" Text="县/镇" Tag="{Binding SelectedValue, ElementName=town}"
Style="{StaticResource TipTextBlock}"/>

TextBlock放在ComboBox上面,Textblock样式如下

  <Style x:Key="TipTextBlock" TargetType="{x:Type TextBlock}">
<Setter Property="IsHitTestVisible" Value="False" />
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="12,0,0,0"/>
<Setter Property="Opacity" Value=""/>
<Style.Triggers>
<Trigger Property="Tag" Value="{x:Null}">
<Setter Property="Opacity" Value=""/>
</Trigger>
</Style.Triggers>
</Style>

枚举在WPF的应用:

  <ComboBox x:Name="cbbDataType" ItemsSource="{Binding Source={StaticResource InfoDetailTypeItems}}"
SelectedItem="{Binding CurrEditorItem.DataType, ValidatesOnDataErrors=True}"
ItemTemplate="{StaticResource InfoDetailTypeDataTemplate}"
Grid.Row="" Grid.Column=""
Style="{StaticResource EditorComboBoxStyle}" />
  <x:Array x:Key="InfoDetailTypeItems" Type="{x:Type adservice:ShowDataType}">
<adservice:ShowDataType>Image</adservice:ShowDataType>
<adservice:ShowDataType>Video</adservice:ShowDataType>
<adservice:ShowDataType>ThreeDModel</adservice:ShowDataType>
</x:Array>
  public ObservableCollection<Employee> userList = new ObservableCollection<Employee>();
public MainWindow()
{
InitializeComponent();
this.List.ItemsSource = userList; ThreadPool.QueueUserWorkItem((m) =>
{
string myfiles = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); var query = from pathname in Directory.GetFiles(myfiles) select new { pathtest = pathname }; foreach (var item in query)
{
this.Dispatcher.BeginInvoke(new Action(() =>
{
userList.Add(new Employee { Name = item.pathtest });
}));
Thread.Sleep(100);
} });
}
 private IList<CategoryTreeDataModel> GenerateTree(IEnumerable<CategoryTreeDataModel> list)
{
IDictionary<int, IList<CategoryTreeDataModel>> childDict = new Dictionary<int, IList<CategoryTreeDataModel>>(); // 生成父子关系字典
foreach (var item in list)
{
if (!childDict.ContainsKey(item.ParentId))
childDict.Add(item.ParentId, new List<CategoryTreeDataModel>());
var tempList = childDict[item.ParentId];
tempList.Add(item);
} if (!childDict.ContainsKey(0)) return null; // 生成TreeModel
foreach (var itemList in childDict.Values)
{
foreach (var item in itemList)
{
var parentId = item.CategoryId;
item.Children = childDict.ContainsKey(parentId) ? childDict[parentId] : null;
}
} return GenerateListTree(childDict[0], 0, childDict).ToList();
} /// <summary>
/// 生成拥有子级关系的列表
/// </summary>
/// <param name="list">父级列表</param>
/// <param name="level">树的层级</param>
/// <param name="childDict">父子关系字典</param>
private IEnumerable<CategoryTreeDataModel> GenerateListTree(IEnumerable<CategoryTreeDataModel> list, int level, IDictionary<int, IList<CategoryTreeDataModel>> childDict)
{
if (list == null) yield break; foreach (var item in list)
{ yield return item; if (!childDict.ContainsKey(item.CategoryId)) continue; foreach (var childItem in GenerateListTree(childDict[item.CategoryId], level + 1, childDict))
{
yield return childItem;
}
}
}

【WPF】城市级联(XmlDataProvider)的更多相关文章

  1. iOS:城市级联列表的使用

    1.介绍: 现在越来越多的项目都用到了地址,尤其是电商O2O的购物平台,我之前做的教育产品和电商产品都用到了,而实现地址的设置用到的技术就是城市级联列表,即普遍的做法就是自定义选择器控件UIPicke ...

  2. GeneXus笔记本—城市级联下拉

    最近在交流GeneXus的时候 总是会遇到有城市级联下拉的问题 这里就简单做几种方式 供大家参考参考 第一种就是直接绑定关联信息然后在后者的条件模块设定条件即可 具体如下: 首先我们所需要的表为pro ...

  3. WPF:ComboBox使用XmlDataProvider做级联

    程序功能: 使用ComboBox做级联,数据源为XML文件,适合小数据量呈现 程序代码: <Window x:Class="WpfApplication1.LayouTest" ...

  4. WPF:在XmlDataProvider上使用主-从绑定(Master-Detail Binding)

    原文 http://www.cnblogs.com/mgen/archive/2011/06/19/2084553.html 示例程序: 如上程序截图,一目了然典型的主从模式绑定应用,如果里面的数据不 ...

  5. Linq 单表城市级联

    var list = (from province in db.Areas && province.IsDel == join city in db.Areas on province ...

  6. WPF:数据和行为

    如果自己来做一个UI框架,我们会首先关注哪些方面?我想UI框架主要处理的一定包括两个主要层次的内容,一个是数据展现,另一个就是数据操作,所以UI框架必须能够接收各种不同的数据并通过UI界面展现出来,然 ...

  7. WPF的本质:数据和行为

    如果自己来做一个UI框架,我们会首先关注哪些方面?我想UI框架主要处理的一定包括两个主要层次的内容,一个是数据展现,另一个就是数据操作,所以UI框架必须能够接收各种不同的数据并通过UI界面展现出来,然 ...

  8. jquery插件课程1 幻灯片、城市选择、日期时间选择、拖放、方向拖动插件

    jquery插件课程1  幻灯片.城市选择.日期时间选择.拖放.方向拖动插件 一.总结 一句话总结:都是jquery插件,都还比较小,参数(配置参数.数据)一般都是通过json传递. 1.插件配置数据 ...

  9. C#源码500份

    C Sharp  短信发送平台源代码.rar http://1000eb.com/5c6vASP.NET+AJAX基础示例 视频教程 http://1000eb.com/89jcC# Winform ...

随机推荐

  1. duilib 给List表头增加百分比控制宽度的功能

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42503147 最近项目里需要用到包含表头列表,而窗体大小改变后,每个列表 ...

  2. github访问很慢的问题

    公司一直用着svn, 之前也的确用过github的版本管理,但是一直都是可视化的操作 这几天面试了几名前端,问了一下发现他们在之前的公司里都是用git的, 于是今天好好温故了一下怎么用命令行进行一下g ...

  3. SCI 投稿全过程信件模板一览

  4. html css 如何将表头固定

    position属性取值为fixed时,则元素的位置将不受滚动条的影响,而是直接依据窗口定位,这就是将表头固定的最直接方法,网上其他途径感觉都是在走弯路.但是与此同时必须解决两个问题.第一:表体将随之 ...

  5. 线程池-Threadlocal

    ThreadLoclc初衷是线程并发时,解决变量共享问题,但是由于过度设计,比如弱引用的和哈希碰撞,导致理解难度大.使用成本高,反而成为故障高发点,容易出现内存泄露,脏数据.贡献对象更新等问题.单从T ...

  6. VC调用易语言DLL

    易语言方面: .版本 .子程序 show, , 公开 ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中. ***注意不 ...

  7. JS设计模式——5.单体模式(用了这么久,竟全然不知!)

    单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? 1.可以用它来划分命名空间(这个就是就是经常用的了) 2.利用分支技术来封装浏览器之间的差异(这个还真没用过,挺新鲜) 3.借 ...

  8. pip install bs4安装失败

    使用管理员方式打开命令提示符框,然后pip install bs4即可安装成功:

  9. php常用函数——数组函数

    php常用函数——数组函数

  10. 016 sleep,wait,yield,join区别

    1.线程通常有五种状态,创建,就绪,运行.阻塞和死亡状态.2.阻塞的情况又分为三种:(1).等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中.进入 ...