zoukankan      html  css  js  c++  java
  • 【WPF】城市级联(XmlDataProvider)

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

      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="0" 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="85" Style="{StaticResource CommonComboBoxStyle}" />
                                <ComboBox Grid.Column="2" 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="85" Style="{StaticResource CommonComboBoxStyle}" />
                                <ComboBox Grid.Column="4" 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="85" Style="{StaticResource CommonComboBoxStyle}" />
                                <ComboBox Grid.Column="6" 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="85" Style="{StaticResource CommonComboBoxStyle}" />
                                <TextBlock Grid.Column="0" Text="国家" Tag="{Binding SelectedValue, ElementName=country}" 
                                           Style="{StaticResource TipTextBlock}"/>
                                <TextBlock Grid.Column="2" Text="省份" Tag="{Binding SelectedValue, ElementName=province}" 
                                           Style="{StaticResource TipTextBlock}"/>
                                <TextBlock Grid.Column="4" Text="市/区" Tag="{Binding SelectedValue, ElementName=city}" 
                                           Style="{StaticResource TipTextBlock}"/>
                                <TextBlock Grid.Column="6" 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="0"/>
                <Style.Triggers>
                    <Trigger Property="Tag" Value="{x:Null}">
                        <Setter Property="Opacity" Value="1"/>
                    </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="2" Grid.Column="1"
                          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;
                    }
                }
            }
    
  • 相关阅读:
    Java开发笔记(四十二)日历工具的常见应用
    Java开发笔记(四十一)日历工具Calendar
    Java开发笔记(四十)日期与字符串的互相转换
    Java开发笔记(三十九)日期工具Date
    Java开发笔记(三十八)利用正则表达式校验字符串
    Java开发笔记(三十七)利用正则串分割字符串
    Java开发笔记(三十六)字符串的常用方法
    Java开发笔记(三十五)字符串格式化
    Git 工作流程
    如果你恨一个程序员,忽悠他去做iOS开发
  • 原文地址:https://www.cnblogs.com/wywnet/p/3818951.html
Copyright © 2011-2022 走看看