Метод 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: