WPF (Windows Presentation Fundation)

Главная | Исходники | Книги | Ссылки |

Связывание с данными в WPF (обзорная статья)

XAML

Описание связывание в XAML возможно двумя способами:
1. При помощи расширения разметки (наиболее частый способ)
  1. <StackPanel>
  2.   <TextBox Name="tb" Text="Введите текст" />
  3.   <TextBlock Text="{Binding ElementName=tb, Path=Text}"/>
  4. </StackPanel>
* This source code was highlighted with Source Code Highlighter.
2. В виде тэгов
XAML
  1. <StackPanel>
  2.   <TextBox Name="tb" Text="Введите текст" />
  3.   <TextBlock>
  4.     <TextBlock.Text> 
  5.       <Binding ElementName="tb" Path="Text"></Binding>
  6.     </TextBlock.Text>
  7.   </TextBlock>
  8. </StackPanel>
* This source code was highlighted with Source Code Highlighter.

Источник данных (source)

Источником данных может быть любой объект поддерживающий механизм InotifyPropertyChanged или являющийся наследником DependencyObject.
Существует четыре способа задания источника данных:
1. Выбор источника по умолчанию (в этом случае источник не указывается):
2. Указание имени источника:
3. Непосредственное описание источника:
  1. <StackPanel>
  2.   <TextBlock>
  3.     <TextBlock.Text> 
  4.       <Binding Path="Text"> 
  5.         <Binding.Source>  
  6.           <TextBlock Text="Связывание текста из описанного источника"/> 
  7.         </Binding.Source> 
  8.       </Binding>
  9.     </TextBlock.Text>
  10.   </TextBlock>
  11. </StackPanel>
* This source code was highlighted with Source Code Highlighter.
4. Биндинг на себя или своего предка:
  1. <StackPanel>
  2.   <TextBlock Tag="Своё собственное свойство" Text="{Binding RelativeSource={RelativeSource Self}, Path=Tag}"/>
  3. </StackPanel>
* This source code was highlighted with Source Code Highlighter.

В данном примере привязка к своему свойству, поэтому используется кострукция RelativeSource={RelativeSource Self}.

Еще пример, в котором источником выступает SelectedItem.Content из ComboBox. Приемник - это фон кнопки, который меняется в зависимости от выбора на: зеленый, синий или красный.

  1. <StackPanel Orientation="Horizontal">
  2.   <Label Content="Выбирете цвет кнопки"/>
  3.   <ComboBox Name="cmbColor" SelectedIndex="0">
  4.     <ComboBoxItem>Green</ComboBoxItem>
  5.     <ComboBoxItem>Blue</ComboBoxItem>
  6.     <ComboBoxItem>Red</ComboBoxItem>
  7.   </ComboBox>
  8.   <Button Background="{Binding ElementName=cmbColor, Path=SelectedItem.Content}" Content="Кнопка"/>
  9. </StackPanel>
* This source code was highlighted with Source Code Highlighter.

Применение IValueConverter при связывании

Интерфейс IValueConverter содержит два метода, которые должны быть определены:
1. object Convert(object value, Type targetType, object parameter, CultureInfo culture)
Этот метод используется для конвертирование объекта источника данных(source) в новое значение, которое будет использоваться при связывании приемником(target).
2. object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
Этот метод используется для обратного конвертирования объекта от приемника к источнику. Используется, когда направление привязки(Binding.Mode) установлен в TwoWay или OneWayToSource

Рассмотрим простой пример, где мы из списка выбираем цвет и прямоугольник заливается этим цветом. Наш конвертер должен преобразовывать String в SolidColorBrush.
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows.Data;
  6. using System.Windows.Media;
  7. using System.Globalization;
  8.  
  9. namespace WpfConverterTest
  10. {
  11.   [ValueConversion(typeof(String), typeof(SolidColorBrush))]
  12.   public class WordToColorConverter : IValueConverter
  13.   {
  14.     public object Convert(object value, Type targetType,
  15.       object parameter, CultureInfo culture)
  16.     {
  17.       string boundWord = value as string;
  18.       SolidColorBrush returnBrush = null;
  19.  
  20.       switch (boundWord)
  21.       {
  22.         case "красный":
  23.           returnBrush = new SolidColorBrush(Colors.Red);
  24.           break;
  25.         case "синий":
  26.           returnBrush = new SolidColorBrush(Colors.Blue);
  27.           break;
  28.         case "желтый":
  29.           returnBrush = new SolidColorBrush(Colors.Yellow);
  30.           break;
  31.         case "зеленый":
  32.           returnBrush = new SolidColorBrush(Colors.Green);
  33.           break;
  34.         default:
  35.           returnBrush = new SolidColorBrush(Colors.Yellow);
  36.           break;
  37.       }
  38.       return returnBrush;
  39.     }
  40.  
  41.     public object ConvertBack(object value, Type targetType,
  42.       object parameter, CultureInfo culture)
  43.     {
  44.       throw new Exception("Не могу конвертировать обратно");
  45.     }
  46.   }
  47. }
* This source code was highlighted with Source Code Highlighter.
Файл XAML выглядит так:
  1. <Window x:Class="WpfConverterTest.Window1"
  2.   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.   xmlns:local="clr-namespace:WpfConverterTest"
  5.   Title="Window1" Height="300" Width="400">
  6.   <Window.Resources>
  7.     <local:WordToColorConverter x:Key="Сonverter1"/>
  8.   </Window.Resources>
  9.  
  10.   <StackPanel Orientation="Vertical">
  11.     <Label Content="Демо. Конвертер текста из списка в заливку"
  12.         FontSize="14" FontWeight="Bold" />
  13.     <StackPanel Orientation="Horizontal">
  14.       <ComboBox Name="comboBox" SelectedIndex="0" Width="100">
  15.         <ComboBoxItem>красный</ComboBoxItem>
  16.         <ComboBoxItem>синий</ComboBoxItem>
  17.         <ComboBoxItem>зеленый</ComboBoxItem>
  18.         <ComboBoxItem>желтый</ComboBoxItem>
  19.       </ComboBox>
  20.       <Rectangle Width="62" Height="25" Margin="100,0,0,0"
  21.         Fill="{Binding ElementName=comboBox, Path=SelectedItem.Content,
  22.         Converter={StaticResource Сonverter1}}"/>
  23.     </StackPanel>
  24.   </StackPanel>
  25.  
  26. </Window>
* This source code was highlighted with Source Code Highlighter.

Скачать исходный проект можно с сервиса народ

Также в конвертер можно передавать параметры.



Главная | Программирование | Покер | Фотография | Разное
© Андрей Семёнов, 2009
Hosted by uCoz