【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;
                }
            }
        }

 

posted @ 2014-07-01 19:30  YoMe  阅读(1247)  评论(0编辑  收藏  举报