вторник, 8 ноября 2011 г.

Конверторы при Binding-е

Понадобился мне Binding к тексту TextBlock-а вот такого вида:
Text="{Binding Fields["Assigned To"].Value}"
Само собой, что это работать не будет. Как сделать чтобы работало? Смотрим далее.
Вариантов несколько.
1. Использовать статические ресурсы.
Собственно создаем конвертор:
class AssignedToConvertor : IValueConverter
{
 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
 {
  string result = "";
  WorkItem current = value as WorkItem;
  if (current != null)
  {
   result = current.Fields["Assigned To"].Value.ToString();
  }
  return result;
 }
 
 public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
 {
  return null;
 }
}
Прописываем ссылку на текущий namespace у контрола который будет использовать конвертер:
xmlns:local="clr-namespace:Здесь_пространство_имен_где_объявлен_класс_конвертор"
Добавляем ресурс:
    <Grid>
        <Grid.Resources>
            <local:AssignedToConvertor x:Key="AssignedToConvertor" />

Правим Binding:
Text="{Binding Converter={StaticResource AssignedToConvertor}}"
Ура, все заработало!

2. Второй вариант, это использовать статический класс, вместо статического ресурса. Т.к. мне лень переделывать тот пример, я покажу как можно изменять цвет фона в зависимости от данных которые лежат в DataContext.
Начинаем с того, что создаем класс конвертор:

class WorkItemTypeToColorConvertor : IValueConverter
{
 
 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
 {
  SolidColorBrush result = null;
  WorkItem current = value as WorkItem;
  if (current != null)
  {
   switch (current.Type.Name)
   {
    case "Task":
     result = new SolidColorBrush(Colors.Yellow);
     break;
    case "Bug":
     result = new SolidColorBrush(Color.FromRgb(255, 210, 210));
     break;
   }
  }
  return result;
 }
 
 public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
 {
  return null;
 }
}

Пишем к нему вот такую статическую обертку:

static class WorkItemTypeToColorConvertorHolder
{
 public static readonly WorkItemTypeToColorConvertor Instance = new WorkItemTypeToColorConvertor();
}
И тогда уже нет необходимости прописывать статический ресурс. прямо в Binding пишем:

<Rectangle Fill="{Binding Converter={x:Static local:WorkItemTypeToColorConvertorHolder.Instance}}"

С применение обоих конверторов выглядеть будет вот так:
Мне если честно нравится первый вариант.

P.s. По типам и картинке догадались, что за программу я пишу?

Комментариев нет:

Отправить комментарий