Выбери любимый жанр
Мир литературы

Выбрать книгу по жанру

Фантастика и фэнтези

Детективы и триллеры

Проза

Любовные романы

Приключения

Детские

Поэзия и драматургия

Старинная литература

Научно-образовательная

Компьютеры и интернет

Справочная литература

Документальная литература

Религия и духовность

Юмор

Дом и семья

Деловая литература

Жанр не определен

Техника

Прочее

Драматургия

Фольклор

Военное дело

Последние комментарии
Сергей2018-11-27
Не книга, а полная чушь! Хорошо, что чит
К книге
Lynxlynx2018-11-27
Читать такие книги полезно для расширени
К книге
Leonika2016-11-07
Есть аналоги и покрасивее...
К книге
Важник2018-11-27
Какое-то смутное ощущение после прочтени
К книге
Aida2018-11-27
Не книга, а полная чушь! Хорошо, что чит
К книге

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


512
Изменить размер шрифта:

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

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

</StackPanel>

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

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

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

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

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
определены два члена, позволяющие выполнять преобразование между источником и целью (в случае двунаправленной привязки). После определения такой класс можно применять для дальнейшего уточнения процесса привязки данных.

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

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

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
по-прежнему будет отображать число с плавающей точкой.