Преобразование типов данных

81

В рассматриваемом в предыдущей статье примере проекта привязка данных действует безошибочно, поскольку исходный тип данных свойства Value обоих элементов управления типа Slider совместим с исходным типом данных свойств Height и Width геометрической формы. Все эти свойства оперируют числовыми значениями (в данном случае double, т.е. с плавающей точкой двойной точности).

Но что, если требуется связать не совсем совместимые по типу данных свойства и преобразовать их значения, например, изменять цвет геометрической формы в зависимости от положения ползунка в третьем элементе управления типа Slider?

При размышлении над этим вопросом становится очевидным следующее затруднение: значение свойства value элемента управления типа Slider относиться к числовому типу данных double, тогда как в свойстве Fill геометрической формы требуется указать объект кисти! Следовательно, если требуется преобразовать значение свойства в новый тип данных, для этой цели можно написать в коде специальный класс, выполняющий подобное преобразование, а затем зарегистрировать его в разметке.

Итак, добавьте еще один элемент управления типа Slider на монтажном столе (его местоположение особого значения не имеет). Затем установите в свойстве Content элемента управления Label значение Shade (Оттенок) и настройте элемент управления типа Slider таким образом, чтобы его ползунок перемещался в пределах от максимального значения 255 до минимального значения 0. Кроме того, убедитесь в том, что в свойстве SmallChange (Незначительное изменение) элемента управления типа Slider установлено значение 1. По завершении разметка новых элементов управления должна выглядеть так, как показано ниже. (Следует иметь в виду, что и в этом случае новые элементы управления расположены по горизонтали на блочной панели типа StackPanel.):

<StackPanel Orientation="Horizontal" Margin="10,126,10,0" VerticalAlignment="Top">
			<TextBlock TextWrapping="Wrap" Text="Shade: " Margin="10" FontSize="16"/>
			<Slider x:Name="slider2" Width="300" Height="40" 
			        VerticalContentAlignment="Stretch" Margin="0,10,0,0" Maximum="255" 
					TickFrequency="10" TickPlacement="BottomRight" Value="80" SmallChange="1"/>
</StackPanel>

Создание специального класса преобразования данных

Прежде чем формировать новую привязку данных, нужно написать специальный класс, к которому придется обращаться во время операции привязки данных. С этой целью введите новый класс C# в свой проект по команде Project --> Add New Item (Проект --> Добавить новый элемент), выбираемой из главного меню в среде Expression Blend IDE. Добавьте новый класс DoubleToSolidBrushConverter.cs в открывшемся диалоговом окне New Item:

Ввод нового класса C# в проект

В специальном классе преобразования данных должен быть реализован конкретный интерфейс NET под названием IValueConverter. В этом интерфейсе определяются два метода: Convert() и ConvertBack(). В частности, метод Convert() вызывается при выполнении операций односторонней привязки данных, тогда как метод ConvertBack() — при выполнении операций двухсторонней привязки данных (оба режима привязки данных более подробно рассматриваются в следующей статье).

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

public class DoubleToSolidBrushConverter : IValueConverter
	{
		public DoubleToSolidBrushConverter()
		{
		}
		
		public object Convert(object value, Type targetType, object parameter,
			System.Globalization.CultureInfo culture)
		{
			double currValue = (double)value;
			byte valueAsByte = (byte)currValue;
			Color color = new Color();
			color.A = 255;
			color.G = valueAsByte;
			return new SolidColorBrush(color);
		}
		
		public object ConvertBack(object value, Type targetType, object parameter,
			System.Globalization.CultureInfo culture)
		{
			return null;
		}
	}

Напомним, что метод Convert() служит для преобразования исходного значения типа double, передаваемого от элемента управления типа Slider к объекту специальной кисти. Как видите, это исходное значение типа double передастся данному методу в качестве аргумента value типа object, а затем приводится к типу данных byte, который ожидает получить новый объект типа Color. Именно это новое значение и послужит для настройки объекта типа SolidCclorBrush на заданный оттенок зеленого в зависимости от настройки свойства G объекта типа SolidColorBrush.

Прежде чем продолжить работу над данным примером проекта, перестройте исходный код по команде меню ProjectoBuild Project (Проект --> Построить проект). Если вы не сделаете этого, то не сможете найти специальный класс преобразования в рассматриваемой далее разметке.

Выбор класса преобразования данных в Expression Blend

А теперь, когда класс преобразования данных внедрен на свое место в текущем проекте, к нему можно обращаться при определении операции привязки данных в разметке XAML. С этой целью откройте файл разметки главного окна приложения MainWindow.xaml в визуальном конструкторе Expression Blend и вновь выберите объект геометрической формы (о данном случае треугольника) на монтажном столе, но на этот раз щелкните на кнопке Advanced options, обозначенной пиктограммой мелкого квадратика справа от свойства Fill, доступного в области Brushes на панели Properties.

После этого выберите из всплывающего меню пункт Data Binding таким же образом, как делали это ранее в данном примере при настройке свойств Height и Width той же самой геометрической формы. И наконец, выберите вкладку Element Property в открывшемся диалоговом окне Create Data Binding.

Выберите третий элемент управления типа Slider в иерархическом представлении слева в диалоговом окне Create Data Binding, а затем попытайтесь найти свойство value справа в том же окне. Как ни странно, оно там отсутствует! Дело в том, что по умолчанию на вкладке Element Property в диалоговом окне Create Data Binding отображаются только совместимые типы данных. Поэтому раскройте список Show (Показ) в нижней части данного окна и выберите из него режим All Properties (Все свойства). И только после этого вы сможете выбрать свойство Value:

Для просмотра несовметимых свойств следует выбрать режим All Properties

В том же самом диалоговом окне можно указать и специальный класс преобразования данных. С этой целью разверните область дополнительных параметров настройки в нижнеи части диалогового окна Create Data Binding и щелкните на кнопке Add new value converter (Добавить новый преобразователь данных) как показано на рисунке, где приведена лишь нужная в данном случае (т.е. нижняя) часть этого диалогового окна:

Специальный класс преобразования данных

Щелкнув на этой кнопке, вы должны обнаружить специальный класс преобразования данных DoubleToSolidBrushConverter среди прочих классов в открывшемся диалоговом окне. Если вам не удастся обнаружить специальный класс преобразования данных в этом окне, это, скорее всего, означает, что вы забыли перестроить свой проект:

Выбор специального класса

Запустите свое приложение на выполнение. Цвет заполнения геометрической формы должен изменяться при перемещении ползунка Shade:

Результат преобразования
Пройди тесты
Лучший чат для C# программистов