Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要在通用列表中查找的WPF转换器_Wpf_Binding - Fatal编程技术网

要在通用列表中查找的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}}" />