Привязка в WPF. Свойства и параметры конвертеров значений

Конвертеры значений в WPF, как и обычные классы C#, могут содержать свойства, значения которых могут присваиваться непосредственно в коде XAML. Кроме этого, в конвертер могут передаваться дополнительные параметры, позволяющие каким-либо образом влиять на ход конвертации. В этой части мы рассмотрим свойства и параметры конвертеров значений в WPF.

Свойства конвертера значений

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

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        xmlns:converters="clr-namespace:WpfApp1"
        Title="MainWindow" Height="450" Width="435">

    <Window.Resources>
        <ResourceDictionary>
            <converters:DoubleToHexConverter x:Key="MyConverter"/>
            <converters:RgbConverter x:Key="RgbConverter"/>
        </ResourceDictionary>
        
    </Window.Resources>

    <Window.Background>
        <SolidColorBrush>
            <SolidColorBrush.Color>
                <MultiBinding Converter="{StaticResource RgbConverter}">
                    <MultiBinding.Bindings>
                        <Binding ElementName="RValue" Path="Value" />
                        <Binding ElementName="GValue" Path="Value"/>
                        <Binding ElementName="BValue" Path="Value"/>
                    </MultiBinding.Bindings>
                </MultiBinding>
            </SolidColorBrush.Color>
        </SolidColorBrush>
    </Window.Background>
    
    <StackPanel>
        <TextBlock Text="{Binding Source={x:Reference RValue},Path=Value, Converter={StaticResource MyConverter}, StringFormat='Красный {0}'}"/>
        <Slider x:Name="RValue" Maximum="255" Minimum="0"/>

        <TextBlock Text="{Binding Source={x:Reference GValue}, Path=Value, Converter={StaticResource MyConverter},StringFormat='Зеленый {0}'}"/>
        <Slider x:Name="GValue" Maximum="255" Minimum="0"/>

        <TextBlock Text="{Binding Source={x:Reference BValue}, Path=Value, Converter={StaticResource MyConverter}, StringFormat='Синий {0}'}"/>
        <Slider x:Name="BValue" Maximum="255" Minimum="0"/>
    </StackPanel>
</Window>

Код конвертера RgbConverter, который и выполняет основную работу по преобразованию значений Value в Color:

public class RgbConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var r = System.Convert.ToByte(values[0]);
        var g = System.Convert.ToByte(values[1]);
        var b = System.Convert.ToByte(values[2]);
        return Color.FromRgb(r, g, b);
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return [];
    }
}

Допустим, мы хотим сделать так, чтобы при формировании цвета использовалось значение альфа-канала (прозрачность). Для этой цели мы могли бы добавить на страницу ещё один Slider или каким-либо другим образом попытались бы получить необходимое нам значение. Второй вариант — использовать свойство конвертера значений. Перепишем код конвертера следующим образом:

public class RgbConverter : IMultiValueConverter
{
    public int Alpha { get; set; }
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var r = System.Convert.ToByte(values[0]);
        var g = System.Convert.ToByte(values[1]);
        var b = System.Convert.ToByte(values[2]);
        return System.Windows.Media.Color.FromArgb((byte)Alpha, r, g, b);
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return [];
    }
}

Здесь мы обычным образом определили публичное свойство Alpha и используем значение этого свойства при получении цвета:

return System.Windows.Media.Color.FromArgb((byte)Alpha, r, g, b);

Воспользуемся этим свойством в нашем приложении. Изменим код XAML страницы следующим образом:

<Window.Resources>
    <ResourceDictionary>
        ...
        <converters:RgbConverter Alpha="100" x:Key="RgbConverter"/>
    </ResourceDictionary>

Значения свойств конвертера не обязательно должны быть примитивными типами данных — это могут быть любые объекты, включая стили оформления.

Параметры конвертера значений

В методах Convert() и ConvertBack() третьим параметром выступает некий object parameter. Чтобы передать в этом параметре какое-либо значение используется свойство ConverterParameter расширения разметки Binding (или MultiBinding). Перепишем код нашего конвертера следующим образом:

public class RgbConverter : IMultiValueConverter
{
     public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var r = System.Convert.ToByte(values[0]);
        var g = System.Convert.ToByte(values[1]);
        var b = System.Convert.ToByte(values[2]);
        var a = System.Convert.ToByte(parameter);
        return System.Windows.Media.Color.FromArgb(a, r, g, b);
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return [];
    }
}

и воспользуемся параметром конвертера в приложении:

  <Window.Resources>
      <ResourceDictionary>
          <converters:DoubleToHexConverter x:Key="MyConverter"/>
          <--Убрали значение свойства Alpha-->
          <converters:RgbConverter x:Key="RgbConverter"/>
      </ResourceDictionary>
      
  </Window.Resources>

  <Window.Background>
      <SolidColorBrush>
          <SolidColorBrush.Color>
              <--Добавили значение параметра-->
              <MultiBinding Converter="{StaticResource RgbConverter}" ConverterParameter="200">
                  <MultiBinding.Bindings>
                      <Binding ElementName="RValue" Path="Value" />
                      <Binding ElementName="GValue" Path="Value"/>
                      <Binding ElementName="BValue" Path="Value"/>
                  </MultiBinding.Bindings>
              </MultiBinding>
          </SolidColorBrush.Color>
      </SolidColorBrush>
  </Window.Background>
<--Здесь оставшийся код MainWindow.xaml-->

Теперь конвертер получает значение прозрачности из параметров:

Свойства и параметры конвертеров значений в WPF

Итого

Свойство конвертера значений — это обычное свойство класса, значение которого мы можем задать каким-либо образом, например, при определении конвертера в XAML. Параметр конвертера — это третий параметр в методах Convert() и ConvertBack() конвертера значений. Параметр конвертера задается в свойстве ConverterParameter расширения Binding или MultiBinding.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии