Язык программирования C#9 и платформа .NET5
Content = "{Binding Path=Value}"/><Button Content="Click" Height="200" FontSize = "{Binding Path=Value}"/></StackPanel>Здесь свойство
панелиDataContextустанавливается напрямую. Таким образом, при перемещении ползунка не только отображается текущее значение в элементеStackPanel, но и в соответствии с этим текущим значением увеличивается размер шрифта элементаLabel(на рис. 25.22 показан возможный вывод).ButtonФорматирование привязанных данных
Вместо ожидаемого целого числа для представления положения ползунка тип
использует значениеScrollBar. Следовательно, по мере перемещения ползунка внутри элементаdoubleбудут отображаться разнообразные значения с плавающей точкой (вродеLabel), которые выглядят не слишком интуитивно понятными для конечного пользователя, почти наверняка ожидающего увидеть целые числа (такие как61.0576923076923,61,62и т.д.).63При желании форматировать данные можно добавить свойство
с передачей ему специальной строки и спецификатора формата .NET Core:ContentStringFormat<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) со следующим кодом:MyDoubleConverterusing 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> // Поскольку заботиться здесь о "двунаправленной" привязке</b><b> // не нужно, просто возвратить значение value.</b>return value;}}}Метод
вызывается при передаче значения от источника (Convert()) к цели (свойствоScrollBarэлементаContent). Хотя он принимает много входных аргументов, для такого преобразования понадобится манипулировать только входным аргументом типаLabel, который представляет текущее значениеobject. Данный тип можно использовать для приведения к целому и возврата нового числа.doubleМетод
будет вызываться, когда значение передается от цели к источнику (если включен двунаправленный режим привязки). Здесь мы просто возвращаем значениеConvertBack(). Это позволяет вводить вvalueзначение с плавающей точкой (например,TextBox) и автоматически преобразовывать его в целочисленное значение (99.9), когда пользователь перемещает фокус из элемента управления. Такое "бесплатное" преобразование происходит из-за того, что метод99будет вызываться еще раз после вызоваConvert(). Если просто возвратитьConvertBack()изnull, то синхронизация привязки будет выглядеть нарушенной, т.к. элементConvertBack()по-прежнему будет отображать число с плавающей точкой.TextBox
