Конвертер WPF для поиска в общем списке - PullRequest
0 голосов
/ 02 июня 2010

У меня есть список данных, где я храню, например, страны с кодом, названием и некоторыми другими данными.

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 ]

3 голосов
/ 03 июня 2010

В зависимости от того, где вы выставляете коллекцию стран, есть несколько разных вариантов.

Если в 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), вы можете передать коллекцию в IValueConverter либо как свойство, либо через ConverterParameter. Вот конвертер со свойством:

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}}" />
0 голосов
/ 02 июня 2010

Прежде всего, вам может понадобиться ORM для создания ваших моделей, так как они, кажется, содержат отношения между ними. Еще проверьте эту статью , чтобы создать EntitySets и EntityRefs вручную, что помогает при поиске. Вы также можете быть заинтересованы в это .

Что бы это ни было, в конечном итоге вам нужно иметь список адресов в классе клиентов.

Кстати, откуда берется модель адреса?

0 голосов
/ 02 июня 2010

Один из вариантов - сделать ваши страны открытыми для статических объектов и поместить их в класс 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>;

таким образом, вы можете получить список в любое время из любого места в вашем приложении.

Edit: Вы также можете использовать ConverterParameter:

<TextBlock Text="{Binding Path=CountryCode, Converter={StaticResource CountryNameLookupConverter}, ConverterParameter={Binding Path=Countries}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...