KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
Перейти на страницу:

      Content = "{Binding Path=Value}"/>

  <Button Content="Click" Height="200" FontSize = "{Binding Path=Value}"/>

</StackPanel>

Здесь свойство

DataContext
панели
StackPanel
устанавливается напрямую. Таким образом, при перемещении ползунка не только отображается текущее значение в элементе
Label
, но и в соответствии с этим текущим значением увеличивается размер шрифта элемента
Button
(на рис. 25.22 показан возможный вывод).

Язык программирования C#9 и платформа .NET5 - _220.png

Форматирование привязанных данных

Вместо ожидаемого целого числа для представления положения ползунка тип

ScrollBar
использует значение
double
. Следовательно, по мере перемещения ползунка внутри элемента
Label
будут отображаться разнообразные значения с плавающей точкой (вроде
61.0576923076923
), которые выглядят не слишком интуитивно понятными для конечного пользователя, почти наверняка ожидающего увидеть целые числа (такие как
61
,
62
,
63
и т.д.).

При желании форматировать данные можно добавить свойство

ContentStringFormat
с передачей ему специальной строки и спецификатора формата .NET Core:

<Label x:Name="labelSBThumb" Height="30" BorderBrush="Blue"

  BorderThickness="2" Content = "{Binding Path=Value}"

  ContentStringFormat="The value is:
{0:F0}"/>

Если в спецификаторе формата отсутствует какой-либо текст, тогда его понадобится предварить пустым набором фигурных скобок, который является управляющей последовательностью для XAML. Такой прием уведомляет процессор о том, что следующие за

{}
символы представляют собой литералы, а не, скажем, конструкцию привязки. Вот обновленная разметка XAML:

<Label x:Name="labelSBThumb" Height="30" BorderBrush="Blue"

  BorderThickness="2" Content = "{Binding Path=Value}"

  ContentStringFormat="{}{0:F0}"/>

На заметку! При привязке свойства

Text
элемента управления пару "имя-значение" объекта
StringFormat
можно добавлять прямо в конструкции привязки. Она должна быть отдельной только для свойств
Content
.

Преобразование данных с использованием интерфейса IValueConverter

Если требуется нечто большее, чем просто форматирование данных, тогда можно создать специальный класс, реализующий интерфейс

IValueCVonverter
из пространства имен
System.Windows.Data
. В интерфейсе
IValueCVonverter
определены два члена, позволяющие выполнять преобразование между источником и целью (в случае двунаправленной привязки). После определения такой класс можно применять для дальнейшего уточнения процесса привязки данных.

Вместо использования свойства форматирования можно применять преобразователь значений для отображения целых чисел внутри элемента управления

Label
. Добавьте в проект новый класс (по имени
MyDoubleConverter
) со следующим кодом:

using System;

using System.Windows.Data;

namespace WpfControlsAndAPIs

{

  public class MyDoubleConverter : IValueConverter

  {

     public object Convert(object value, Type targetType, object parameter,

System.Globalization.CultureInfo culture)

    {

<b>      // Преобразовать значение double в int.</b>

      double v = (double)value;

      return (int)v;

    }

    public object ConvertBack(object value, Type targetType, object parameter,

                              System.Globalization.CultureInfo culture)

    {

<b>      // Поскольку заботиться здесь о &quot;двунаправленной&quot; привязке</b>

<b>      // не нужно, просто возвратить значение value.</b>

      return value;

    }

  }

}

Метод

Convert()
вызывается при передаче значения от источника (
ScrollBar
) к цели (свойство
Content
элемента
Label
). Хотя он принимает много входных аргументов, для такого преобразования понадобится манипулировать только входным аргументом типа
object
, который представляет текущее значение
double
. Данный тип можно использовать для приведения к целому и возврата нового числа.

Метод

ConvertBack()
будет вызываться, когда значение передается от цели к источнику (если включен двунаправленный режим привязки). Здесь мы просто возвращаем значение
value
. Это позволяет вводить в
TextBox
значение с плавающей точкой (например,
99.9
) и автоматически преобразовывать его в целочисленное значение (
99
), когда пользователь перемещает фокус из элемента управления. Такое "бесплатное" преобразование происходит из-за того, что метод
Convert()
будет вызываться еще раз после вызова
ConvertBack()
. Если просто возвратить
null
из
ConvertBack()
, то синхронизация привязки будет выглядеть нарушенной, т.к. элемент
TextBox
по-прежнему будет отображать число с плавающей точкой.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*