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实现 LeetCode 735 行星碰撞(栈)
    Java实现 LeetCode 735 行星碰撞(栈)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 蓝桥杯算法提高 求最大值
    Java实现 蓝桥杯算法提高 求最大值
    Java实现 蓝桥杯算法提高 求最大值
    Python eval() 函数
    Python repr() 函数
  • 原文地址:https://www.cnblogs.com/wywnet/p/3818951.html
Copyright © 2011-2022 走看看