Метод Convert()
вызывается при передаче значения от источника (ScrollBar
) к цели (свойство Content
элемента Label
). Хотя он принимает много входных аргументов, для такого преобразования понадобится манипулировать только входным аргументом типа object
, который представляет текущее значение double
. Данный тип можно использовать для приведения к целому и возврата нового числа.
Метод ConvertBack()
будет вызываться, когда значение передается от цели к источнику (если включен двунаправленный режим привязки). Здесь мы просто возвращаем значение value
. Это позволяет вводить в TextBox
значение с плавающей точкой (например, 99.9
) и автоматически преобразовывать его в целочисленное значение (99
), когда пользователь перемещает фокус из элемента управления. Такое "бесплатное" преобразование происходит из-за того, что метод Convert()
будет вызываться еще раз после вызова ConvertBack()
. Если просто возвратить null
из ConvertBack()
, то синхронизация привязки будет выглядеть нарушенной, т.к. элемент TextBox
по-прежнему будет отображать число с плавающей точкой.
Чтобы применить построенный преобразователь в разметке, сначала нужно создать локальный ресурс, представляющий только что законченный класс. Не переживайте по поводу механики добавления ресурсов; тема будет детально раскрыта в нескольких последующих главах. Поместите показанную ниже разметку сразу после открывающего дескриптора Window
:
Далее обновите конструкцию привязки для элемента управления Label
:
BorderThickness="2"
Content = "{Binding Path=Value,
Converter={StaticResource
DoubleConverter}}" />
Теперь после запуска приложения вы будете видеть только целые числа.
Установление привязок данных в коде
Специальный преобразователь данных можно также регистрировать в коде. Начните с очистки текущего определения элемента управления Label
внутри вкладки Data Binding
, чтобы расширение разметки {Binding}
больше не использовалось:
BorderThickness="2" />
Добавьте оператор using
для System.Windows.Data
и в конструкторе окна вызовите новый закрытый вспомогательный метод по имени SetBindings()
, код которого показан ниже:
using System.Windows.Data;
...
namespace WpfControlsAndAPIs
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
...
SetBindings();
}
...
private void SetBindings()
{
// Создать объект Binding.
Binding b = new Binding
{
// Зарегистрировать преобразователь, источник и путь.
Converter = new MyDoubleConverter(),
Source = this.mySB,
Path = new PropertyPath("Value")
// Вызвать метод SetBindingO объекта Label.
this.labelSBThumb.SetBinding(Label.ContentProperty, b);
}
}
}
}
Единственная часть метода SetBindings()
, которая может выглядеть несколько необычной — вызов SetBinding()
. Обратите внимание, что первый параметр обращается к статическому, доступному только для чтения полю ContentProperty
класса Label
. Как вы узнаете далее в главе, такая конструкция называется Label
в рассматриваемом случае), за которым следует обращение к внутреннему свойству с добавлением к его имени суффикса Property
. Запустив приложение, можно удостовериться в том, что элемент Label
отображает только целые числа.
Построение вкладки DataGrid
В предыдущем примере привязки данных иллюстрировался способ конфигурирования двух (или большего количества) элементов управления для участия в операции привязки данных. Наряду с тем, что это удобно, возможно также привязывать данные из файлов XML, базы данных и объектов в памяти. Чтобы завершить текущий пример, вы должны спроектировать финальную вкладку элемента управления DataGrid
, которая будет отображать информацию, извлеченную из таблицы Inventory
базы данных AutoLot
.
Как и с другими вкладками, начните с замены текущего элемента Grid
панелью StackPanel
, напрямую обновив разметку XAML в Visual Studio. Внутри нового элемента StackPanel
определите элемент управления DataGrid
по имени gridInventory
: