Чтение онлайн

на главную

Жанры

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

<!-- Разбиение объекта и значения посредством DataContext -->

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

BorderThickness="2"

DataContext = "{Binding ElementName=mySB}"

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

В текущем примере вывод будет идентичным. С учетом этого вполне вероятно вас интересует, в каких случаях необходимо устанавливать свойство

DataContext
явно.
Поступать так может быть удобно из-за того, что подэлементы способны наследовать свои значения в дереве разметки.

Подобным образом можно легко устанавливать один и тот же источник данных для семейства элементов управления, не повторяя избыточные фрагменты XAML-разметки

"{Binding ElementName=X, Path=Y}"
во множестве элементов управления. Например, пусть в панель
StackPanel
вкладки добавлен новый элемент
Button
(вскоре вы увидите, почему он имеет настолько большой размер):

<Button Content="Click" Height="200"/>

Чтобы сгенерировать привязки данных для множества элементов управления, вы могли бы применить Visual Studio, но взамен введите модифицированную разметку в редакторе XAML:

<!-- Обратите внимание, что StackPanel устанавливает

свойство DataContext -->

<StackPanel Background="#FFE5E5E5"

DataContext = "{Binding ElementName=mySB}">

...

<!-- Теперь оба элемента пользовательского интерфейса работают

со значением линейки прокрутки уникальными путями -->

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

BorderThickness="2"

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

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

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)

{

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

double v = (double)value;

return (int)v;

}

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

Поделиться:
Популярные книги

Газлайтер. Том 9

Володин Григорий
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Газлайтер. Том 9

Кодекс Крови. Книга VI

Борзых М.
6. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VI

Все ведьмы – стервы, или Ректору больше (не) наливать

Цвик Катерина Александровна
1. Все ведьмы - стервы
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Все ведьмы – стервы, или Ректору больше (не) наливать

Я еще не князь. Книга XIV

Дрейк Сириус
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не князь. Книга XIV

Я не Монте-Кристо

Тоцка Тала
Любовные романы:
современные любовные романы
5.57
рейтинг книги
Я не Монте-Кристо

Мимик нового Мира 14

Северный Лис
13. Мимик!
Фантастика:
юмористическое фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 14

Правила Барби

Аллен Селина
4. Элита Нью-Йорка
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Правила Барби

Морозная гряда. Первый пояс

Игнатов Михаил Павлович
3. Путь
Фантастика:
фэнтези
7.91
рейтинг книги
Морозная гряда. Первый пояс

Идущий в тени 6

Амврелий Марк
6. Идущий в тени
Фантастика:
фэнтези
рпг
5.57
рейтинг книги
Идущий в тени 6

Фиктивная жена

Шагаева Наталья
1. Братья Вертинские
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Фиктивная жена

Маленькая слабость Дракона Андреевича

Рам Янка
1. Танцы на углях
Любовные романы:
современные любовные романы
эро литература
5.25
рейтинг книги
Маленькая слабость Дракона Андреевича

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Последняя Арена

Греков Сергей
1. Последняя Арена
Фантастика:
боевая фантастика
постапокалипсис
рпг
6.20
рейтинг книги
Последняя Арена