首先在绑定的时候进行转换:
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;
}
}
}