Расширение разметки ' RelativeSource ' используется для привязки к объекту за пределами DataContext.В отличие от расширения «StaticResource», оно применяется к свойству «RelativeSource» Binding
вместо свойства «Source».Его можно использовать для обхода визуального дерева.Имейте в виду, что вы создаете дерево элементов.«RelativeSource» позволяет вам пройти это дерево обратно к корневому элементу и выбрать один посещенный элемент в качестве источника привязки, передав тип целевого элемента и уровень относительного дерева.Это похоже на установку свойства 'Source' для объекта Binding
, где вы указали бы источник данных.Сами данные или путь к данным в этом источнике задаются свойством «Путь» Binding
.
Вам придется обходить дерево, пока не найдете элемент, который предоставляет правильные данные.В вашем случае обязательным источником данных привязки является ListView
(который находится вне контекста данных по умолчанию -> относительный источник).ListView
предоставляет данные RaceSimulatorViewModel
через DataContext.
То есть
Command="{Binding DataContext.CanStartRaceCheckCommand, RelativeSource={RelativeSource AncestorType={x:Type vm:RaceSimulatorViewModel}, AncestorLevel=1}}"
становится
Command="{Binding DataContext.CanStartRaceCheckCommand, RelativeSource={RelativeSource AncestorType=ListView}}"
В общем случае контекст данных наследуется дочерними элементами.Для шаблонов (ControlTemplate
, DataTemplate
) это немного отличается.Как следует из названий шаблонов, ControlTemplate
используется для описания элемента управления и DataTemplate
для описания данных (или того, как они визуализируются).Поэтому контекст данных ControlTemplate
является шаблонным элементом управления, тогда как контекст данных DataTemplate
является шаблонными данными (в вашем случае Person
объект данных).Это позволяет основывать визуальные эффекты на состоянии данных, например, «Person.Age» <18 -> рисует их красным.ControlTemplate
в отличие, в основном, основано на состоянии управления, например, CheckBox.IsChecked
?-> изменить видимость другого элемента управления.