Как вы сказали, DataContext установлен в класс ViewModel, поэтому элемент управления, который вы упомянули в XAML, сможет получить доступ к открытым свойствам этого ViewModel.
Например:
private ObservableCollection<Commander> commands = new ObservableCollection<Commander>();
public ObservableCollection<Commander> Commands {
get { return commands; }
set { commands = value; }
}
Структура командующего класса.
public class Commander {
public ICommand Command { get; set; }
public string DisplayName { get; set; }
}
У этой виртуальной машины есть свойство Commands, которое может быть ObservableCollection. Это свойство может быть доступно из XAML.
Вы можете представить, что HeaderedContentControl является контейнером. Содержимое этого HeaderedContentControl представляет собой DataTemplate "CommandsTemplate", который имеет ItemsControl и привязывается к свойству Commands виртуальной машины.
Content = "{Binding Path = Commands}"
И затем вы можете снова связать ItemControl с командами, но этот ItemControl находится внутри содержимого, связываемого с командами. Таким образом, вам не нужно указывать путь снова. Вы можете просто использовать
ItemsSource="{Binding}" instead of ItemsSource="{Binding Commands}".
Два текстовых блока находятся внутри ItemControl, поэтому они находятся на том же уровне, что и класс Commander Commands ObservableCollection. Вот почему вы можете напрямую получить доступ к Text = "{Binding Path = DisplayName}".
Надеюсь, это поможет.