Подтвердить что ты не робот

Написание условных операторов в коде XAML

У меня есть этот списокBox, который заполняется, каждый элемент может быть как мужским, так и женским в зависимости от свойства "SEX", привязанного к listBox. (Может быть "М" для мужчин и "F" для женщин)...

Для каждого элемента я хотел бы отображать мужской или женский символ на основе свойства SEX списка элементов.

например, если "{Binding SEX}" равно "M":

<Image Source="../Images/male48.png" Visibility="Visible" />

и если "{Binding SEX}" равно 'F':

<Image Source="../Images/female48.png" Visibility="Visible" />

Как именно я собираюсь заставить это работать?

4b9b3361

Ответ 1

Общим подходом к этой проблеме является создание преобразователя значений, который преобразует значение, возвращаемое привязкой, в другое значение, относящееся к свойству элемента управления пользовательского интерфейса.

Вы можете создать конвертер, который принимает секс и сопоставляет его с источником изображения:

public class SexToSourceConverter : IValueConverter
{
  public object Convert(object value, string typeName, object parameter, string language)
  {
     string url = ((string)value == "M") ? "../Images/male48.png" :  "../Images/female48.png";
    return new BitmapImage(new Uri(url , UriKind.Relative));
  }

  public object ConvertBack(object value, string typeName, object parameter, string language)
  {
    throw new NotImplementedException();
  }
}

Используя его в своем XAML, выполните следующие действия:

<Image Source="{Binding Path=Sex, Converter={StaticResource SexToSourceConverter }" />

Ответ 2

Если кто-то заинтересован в том, как это может сработать, я сделал решение на основе ответа ColinE. Во-первых, вы должны создать новый класс, который содержит условия, которые вы хотите добавить в код XAML:

public class MyNiceConverterName : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        // Your conditions here!
        return value_you_want_to_return; // E.g., a string, an integer and so on
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        throw new NotImplementedException(); // Leave this like here, don't worry
    }
}

Вызвать класс, который вы хотите (прямо сейчас он называется MyNiceConverterName), и реализовать метод Convert() с условиями, которые вы хотите добавить в файл XAML. Не забудьте применить object value к типу, который вы используете (например, (int)value, если это целое число).

Это почти сделано! Но еще нет, сначала объявите конвертер в своем XAML как ресурсе. Вы можете вставить этот код под объявлением пространств имен:

<Control.Resources>
    <converter:MyNiceConverterName xmlns:converter="clr-namespace:My_Namespace" x:Key="MyNiceConverterName" />
</Control.Resources>

Вы должны объявить пространство имен, в котором вы определили класс (т.е. удалить My_Namespace с вашими данными), а также переименовать MyNiceConverterName в имя вашего класса. Ключ будет именем, указанным для ссылки на конвертер в документе XAML, здесь я использовал одно и то же имя класса, но вы можете его свободно изменить.

Наконец, пришло время использовать конвертер. Поместите это, и все готово:

{Binding variable_with_value, Converter={StaticResource MyNiceConverterName}}

Не забудьте изменить variable_with_value на тот, который вы хотите использовать в своей привязке.

Надеюсь, это поможет!