Страницы

четверг, 2 мая 2013 г.

Binding ContentControl.DataTemplate к ViewModel

Иногда необходимо использовать ContentControl с подключенным стилем, который содержит DataTemplate. При этом хочется, что бы ContentControl не был связан с какой либо конкретной property ViewModel, а элементы в DataTemplate стиля, имели доступ ко всем property ViewModel (которая устанавливается в DataContext на уровне всего UserControl)

Что хочется: в создаваемом UserControl (View - pattern MVVM) необходимо расположить ContentControl с привязаным к нему стилем, в стиле мы хотим определить DataTemplate, элементы которого связаны c property ViewModel, которая устанавливается как DataContext для создаваемого UserControl
Для реализации данной задачи у нас есть следующий XAML код:
В исходном коде подсвечены: создаваемый стиль с DataTemplate и ContentControl к которому этот стиль применяется.
Но тут, нас ожидает сюрприз, а именно, Binding написанный в DataTemplate не срабатывает, при этом не видно никаких warning сообщений в Output окне, при запуске приложения в debug режиме.
На самом деле, это происходит от того, что используемый ContentControl не связан ни с одним свойством ViewModel, так же, он ничего не знает о самой ViewModel, соответсвенно Binding выражения написаные в DataTemplate не имеют связи с реальными объектами.

Для того, чтобы разрешить эту проблему, достаточно в ContentControl указать, что ContentControl.Content наследует Binding элемента расположенного выше по визуальному дереву, в данном конкретном случае, это DataContext создаваемого UserControl, что нам и нужно.
Выражение, которое мы добавляем, это: Content="{Binding}"
Ну вот, и все. Все элементы имеющий Binding выражения в DataTemplate стиля имеют доступ к свойствам ViewModel создаваемого UserControl.
Конечно, тоже самое можно было проделать используя более длинную записью,  устанавливая binding на DataContext с RelativeSource, но запись с {Binding} выглядит IMHO лучше.

Комментариев нет :

Отправить комментарий