Главная » Silverlight » Условное форматирование

1

Наиболее интересные преобразователи значений разрабатываются не для формати­рования данных для целей презентации (это довольно тривиальная задача), а для из­менения внешнего вида элементов управления на основе полученных данных.

Предположим, нужно изменить цвет фона элемента для продуктов, цена которых превышает заданное значение. Инкапсулировать логику изменения легче всего с по­мощью преобразователя значений.

public class PriceToBackgroundConverter : IValueConverter

{

public double MinimumPriceToHighlight {

get; set;

}

public Brush HighlightBrush {

get; set;

}

public Brush DefaultBrush {

get; set;

public object Convert(object value, Type targetType, object parameter,

System.Globalization.Culturelnfо culture) { ?

double price = (double)value; if (price >= MinimumPriceToHighlight)

return HighlightBrush; else

return DefaultBrush;

}

public object ConvertBack(object value, Type targetType, object parameter,

System.Globalization.Culturelnfо culture)

{

throw new NotSupportedException ();

}

}

Совет. Если выполнить преобразование невозможно, установите возврат значения Binding.Unsetvalue, чтобы сообщить Silverlight о необходимости проигнорировать связывание. В связанном свойстве (в данном случае — Background) останется значение, установленное по умолчанию.

Преобразователи значений обычно создаются с учетом возможности повторного ис­пользования. Для этого, вместо жесткого кодирования параметров подсвечивания в пре­образователе, задайте их в разметке XAML, в которой используется преобразователь.

<local:PriceToBackgroundConverter х:Кеу="PriceToBackgroundConverter" DefaultBrush="{х:Null}" HighlightBrush="Orange" MinimumPriceToHighlight="50">

</local:PriceToBackgroundConverter>

В данной разметке вместо цветов используются кисти, что позволяет создавать ви­зуальные эффекты подсвечивания с помощью градиентов и фоновых изображений. Если нужно применить стандартный прозрачный фон (чтобы выводился фон родитель­ского элемента), присвойте свойству DefaultBrush или HighlightBrush значение Null, как в приведенной выше разметке.

Теперь осталось лишь применить преобразователь PriceToBackgroundConverter для установки фона какого-либо элемента, например рамки Border, содержащей другие элементы.

<Border Background3 "{Binding UnitCost, Converter={StaticResource

PriceToBackgroundConverter}}" . .. >

Во многих случаях возникает необходимость передать преобразователю допол­нительную информацию, кроме преобразуемых данных. Например, для конвертера PriceToBackgroundConverter необходимы цвет фона и пороговое значение цены. В дан­ном примере эта информация передается посредством свойств. Однако существует альтернативное решение: конвертеру можно передать один объект любого типа посред­ством выражения связывания, установив его свойство ConverterParameter. В приве­денной ниже разметке таким образом передается пороговое значение цены.

<Border Background= "{Binding UnitCost, Converter={StaticResource PriceToBackgroundConverter}, ConverterParameter=50}" . .. >

Параметр передается в метод Convert () как аргумент. Для его применения нужно изменить предыдущий пример следующим образом.

public object Convert(object value, Type targetType, object parameter,

System.Globalization.Culturelnfo culture)

{

double price = (double)value; if (price >= Double.Parse(parameter))

return HighlightBrush; else

return DefaultBrush;

}

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

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии

1 комментарий

  1. ожидал что вы предложите решение через тригеры :(
    в WPF работает, а silverlight нет…