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

                }

            }

        }

 

你可能感兴趣的:(Provider)