WPF转换器查找通用列表

时间:2010-06-02 17:06:57

标签: wpf binding

我有一个数据列表,例如包含代码,名称和其他一些数据的国家/地区。

List<Country> countries = <deserialized objects from file>

由以下对象组成:

  public class Country
  {
       public string Code { get; set;}
       public string Name { get; set;}
  }

用作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文件中读取的国家/地区列表?

3 个答案:

答案 0 :(得分:3)

根据您展示国家/地区集合的位置,有几种不同的选择。

如果国家/地区存在于Address或其他ViewModel对象中,则更改转换器以实现IMultiValueConverter而不是IValueConverter,然后使用MultiBinding传递CountryCode和国家/地区(作为属性公开)。然后,您将访问并转换值[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;
    }
}

并且转换器资源将声明为:

<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}}" />

答案 1 :(得分:0)

一种选择是让您的国家/地区对象公开静态并将其放在Country类中。例如:

public class Country
{
    public static List<Country> Countries;
    public string Code { get; set;}
    public string Name { get; set;}
}

您可以从XML文件中读取并在应用程序的构造函数中设置此类文件(或者在可能需要的任何地方)。例如:

Country.Countries = <deserialized objects from file>;

通过这种方式,您可以随时从应用程序的任何位置获取列表。

编辑: 您也可以使用ConverterParameter:

<TextBlock Text="{Binding Path=CountryCode, Converter={StaticResource CountryNameLookupConverter}, ConverterParameter={Binding Path=Countries}}"/>

答案 2 :(得分:-1)

首先,您可能需要ORM来创建模型,因为它们似乎包含它们之间的关系。否则,请检查此article以手动创建EntitySets和EntityRefs,这有助于查找。您可能也对this感兴趣。

无论是什么,最终您需要在Customer Class中有一个Address列表。

顺便说一句,地址模型来自哪里?