
- •«Комп’ютерні технології та програмування»
- •Оглавление
- •Лабораторная работа 1 Знакомство с wpf
- •Теоретические сведения
- •1. Знакомство с редактором xaml
- •2.Создание приложения wpf
- •3) Создание обработчиков событий
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 2 Подробное введение в разработку приложений wpf
- •Теоретические сведения
- •1. Ознакомление с управлением проектами wpf в msVisualStudio
- •2. Создание тестового приложения wpf
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 3 Макет программы и основные элементы управления
- •Теоретически сведения
- •1. Макет в wpf
- •2. Новые возможности wpf
- •3. Элемент управления Canvas
- •4. Элементуправления StackPanel
- •5. Элементуправления WrapPanel
- •6. Элемент управления DockPanel
- •7. Элемент Grid
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 4
- •Xaml и код, расширения разметки и ресурсы
- •Теоретически сведения
- •2. Ссылки на ресурсы в wpf
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 6 Свойства зависимости
- •Теоретически сведения
- •1. Особенности свойств clr
- •2. Наследование значений свойств зависимости
- •3. Присоединенные свойства
- •4. Метаданныесвойствзависимости
- •5. Проверка допустимости значения
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 7 Привязка данных
- •Теоретически сведения
- •1. Концепция привязки данных
- •2. Свойство DataContext
- •3. Основные понятия привязки данных
- •4. Синтаксис привязки данных
- •5. Привязка к элементам интерфейса пользователя
- •6. Привязка к xml
- •7. Привязка к коллекции
- •8. Преобразователи значений привязки данных
- •9. Проверкапривязкиданных
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
8. Преобразователи значений привязки данных
Преобразователь значений действует аналогично функции sprintf в WPF. Он предоставляет привязке новый объект — того же типа, что и исходный, или полностью новый. Например, в WPF используются неизменные объекты Freezable. При попытке анимировать такой объект возникнут проблемы. Раньше я решал эту проблему с помощью преобразователя значений Clone: он предоставлял привязке клонированный объект, чтобы использовать его в анимации.
Чаще всего преобразователи значений используются для небольших изменений, связанных с форматированием (рис. 7.5).
Рис. 7.5. Привязка данных
Преобразователи значений находятся между исходным значением и привязанным целевым свойством. Их единственное назначение — получать значение и предоставлять другое значение.
Интерфейс IValueConverter содержит следующие методы, которые необходимо реализовать.
object Convert(object value, Type targetType, object parameter, CultureInfo culture)
Этот метод используется для преобразования исходного объекта в новое значение, которое будет использоваться для целевого свойства.
object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
Этот метод используется для преобразования целевого объекта в исходный. Он применяется, если свойству привязки Binding.Mode присвоено значение TwoWay или OneWayToSource. Во всех остальных случаях он просто создает исключение.
Для использования этих преобразователи значений в коде нужно использовать обычное выражение Binding и указать используемый преобразователь в свойстве Binding.Converter. Рассмотрим пример.
В состав демонстрационного решения входит проект ValueConverters, который при выполнении выглядит так (рис. 7.6):
Рис. 7.6 - Демонстрационная программа
В этом небольшом примере используются два преобразователя значений. Первый преобразует название цвета в объект Brush, который используется для раскраски объекта Rectangle. Второй использует объект DataContext, заданный явно в коде программной части, а свойству DataContext двух объектов Label присваивается новый объект DataContext. Посмотрим код.
XAML:
<Window x:Class="ValueConverters.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ValueConverters"
WindowStartupLocation="CenterScreen"
Title="Window1" Height="800" Width="800">
<Window.Resources>
<local:WordToColorConverter x:Key="wordToColorConv"/>
<local:DateConverter x:Key="dateConv"/>
</Window.Resources>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<StackPanel Orientation="Vertical">
<!--Использование преобразователя значения для преобразования текста в цвет -->
<Label Content="Using Vaue Converter To Convert Text To Fill Color"
Margin="5,0,0,0" FontSize="14" FontWeight="Bold" />
<StackPanel Orientation="Horizontal" Margin="10,10,10,10" Background="Gainsboro">
<TextBlock TextWrapping="Wrap" Text="Using Vaue Converter. Type 'hot' or 'cold'
into the textbox and watch the rectangle change color" Width="400"/>
<TextBox x:Name="txtSource" Width="50" Height="25" Margin="5,0,0,0"/>
<Rectangle Width="50" Height="25" Margin="5,0,0,0"
Fill="{Binding ElementName=txtSource, Path=Text,
Converter={StaticResource wordToColorConv}}" />
</StackPanel>
<!-- Использование преобразователя значения для преобразования даты в короткий формат -->
<Label Content="Using Vaue Converter To Convert Date To Short Date"
Margin="5,0,0,0" FontSize="14" FontWeight="Bold" />
<StackPanel Orientation="Vertical" Margin="10,10,10,10" Background="Gainsboro">
<StackPanel Orientation="Horizontal">
<Label Content="LongDate"/>
<Label x:Name="lblLongDate" Content="{Binding Path=Now}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Content="ShortDate thanks to value converter"/>
<Label x:Name="lblShortDate" Content="{Binding Path=Now,
Converter={StaticResource dateConv}}"/>
</StackPanel>
</StackPanel>
</StackPanel>
</ScrollViewer>
</Window>
Код программной части для этого окна.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ValueConverters
{
/// <summary>
/// Логикавзаимодействиядля Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
lblLongDate.DataContext = new DateTime();
lblShortDate.DataContext = new DateTime();
}
}
}
Преобразователи:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Windows.Media;
using System.Globalization;
namespace ValueConverters
{
[ValueConversion(typeof(String), typeof(SolidColorBrush))]
public class WordToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
string boundWord = value as string;
SolidColorBrush returnBrush = null;
switch (boundWord.ToLower().Trim())
{
case "hot":
returnBrush = new SolidColorBrush(Colors.Red);
break;
case "cold":
returnBrush = new SolidColorBrush(Colors.Green);
break;
default:
returnBrush = new SolidColorBrush(Colors.Yellow);
break;
}
return returnBrush;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new Exception("Cant convert back");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Windows.Media;
using System.Globalization;
namespace ValueConverters
{
[ValueConversion(typeof(DateTime), typeof(String))]
public class DateConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
DateTime date = (DateTime)value;
return date.ToShortDateString();
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
string strValue = value.ToString();
DateTime resultDateTime;
if (DateTime.TryParse(strValue, out resultDateTime))
{
return resultDateTime;
}
return value;
}
}
}