Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Wpf-АК11.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
3.47 Mб
Скачать

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;

       }

   }

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]