要在通用列表中查找的WPF转换器
我有一个保存数据的列表,例如带有代码、名称和一些其他数据的国家要在通用列表中查找的WPF转换器,wpf,binding,Wpf,Binding,我有一个保存数据的列表,例如带有代码、名称和一些其他数据的国家 List<Country> countries = <deserialized objects from file> 用作DataContext的对象可能如下所示: public class Address { public string StreetName{ get; set;} public string CountryCode { get; set;} } 然后在我的XAML中,我
List<Country> countries = <deserialized objects from file>
用作DataContext的对象可能如下所示:
public class Address
{
public string StreetName{ get; set;}
public string CountryCode { get; set;}
}
然后在我的XAML中,我想做一些类似的事情来显示这个国家的名称
<TextBlock Text="{Binding Path=CountryCode, Converter={StaticResource CountryNameLookupConverter}}"/>
但是如何让CountryNameLookupConverter使用我从xml文件中读取的国家列表呢?一个选项是将您的国家对象设置为public static,并将其放入Country类中。例如:
public class Country
{
public static List<Country> Countries;
public string Code { get; set;}
public string Name { get; set;}
}
公共类国家
{
公开静态名单国家;
公共字符串代码{get;set;}
公共字符串名称{get;set;}
}
您可以从XML文件中读取数据,并在应用程序的构造函数中进行设置或类似的设置(或在任何需要的地方)。例如:
Country.Countries=;
这样,您可以随时从应用程序中的任何位置获取列表
编辑:
您还可以使用ConverterParameter:
<TextBlock Text="{Binding Path=CountryCode, Converter={StaticResource CountryNameLookupConverter}, ConverterParameter={Binding Path=Countries}}"/>
首先,您可能需要一个ORM来创建您的模型,因为它们似乎包含它们之间的关系。否则,请选中此项以手动创建EntitySet和EntityRefs,这有助于查找。你也可能对这一点感兴趣 不管是什么,最终您需要在Customer类中有一个地址列表
顺便问一下,地址模型从何而来?根据您在何处公开countries集合,有几个不同的选项 如果地址或某些其他ViewModel对象中存在国家/地区,请将转换器更改为实现IMultiValueConverter而不是IValueConverter,然后使用多重绑定传递国家/地区代码和国家/地区(作为属性公开)。然后,您将访问并强制转换值[0]和值[1],以使用它们在Convert方法中执行查找
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource CountryNameLookupConverter}">
<Binding Path="CountryCode" />
<Binding Path="Countries" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
如果以静态方式公开国家(即Lookup.countries),则可以将集合作为属性或通过ConverterParameter传递给IValueConverter。以下是具有属性的转换器:
public class CountryNameLookupConverter : IValueConverter
{
public IEnumerable<Country> LookupList { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Country country = LookupList.FirstOrDefault(c => c.Code.Equals(value));
if (country == null)
return "Not Found";
return country.Name;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
公共类CountryNameLookupConverter:IValueConverter
{
公共IEnumerable LookupList{get;set;}
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
Country-Country=LookupList.FirstOrDefault(c=>c.Code.Equals(value));
如果(国家==null)
返回“未找到”;
返回国家。名称;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
不做任何事;
}
}
转换器资源的声明如下:
<local:CountryNameLookupConverter x:Key="CountryNameLookupConverter" LookupList="{x:Static local:Lookup.Countries}"/>
或者改为传递到Convert的对象参数:
<TextBlock Text="{Binding Path=CountryCode, Converter={StaticResource CountryNameLookupConverter}, ConverterParameter={x:Static local:Lookup.Countries}}" />
谢谢。最后,我使用了最后一个选项和一些延迟加载列表。效果非常好。ConverterParameter={Binding Path=Countries}错误,无法在ConverterParameter上设置绑定。绑定目标必须是DependencyProperty
<local:CountryNameLookupConverter x:Key="CountryNameLookupConverter" LookupList="{x:Static local:Lookup.Countries}"/>
<TextBlock Text="{Binding Path=CountryCode, Converter={StaticResource CountryNameLookupConverter}, ConverterParameter={x:Static local:Lookup.Countries}}" />