Для чего нужен DataContext?

В качестве продолжения вопроса связывается DataContext с другим свойством в WPF .

В самом конце исследования я был очень удивлен, узнав, что когда что-то пишет:

 

DataContext с которым связано свойство Content принадлежит самому методу Label ! Тот факт, что он все еще работает, связан с наследованием по умолчанию значения DataContext от ближайшего родителя.

Но если у вас есть этот ярлык, завернутый в пользовательский элемент управления, и вы не хотите привязывать свои данные к свойству DataContext элемента управления, вам, скорее всего, понравится:

  

И ты здесь. Теперь вам нужно установить « Settings в качестве DataContext для SearchSettings управления SearchSettings , для Label внутри для привязки, но вы не можете, потому что это вызовет повторное связывание свойства Settings .

Я не вижу смысла в смешивании свойств привязки с использованием разных источников: DataContext , ElementName и т. Д. Так почему бы мне использовать DataContext ?

Когда вы пишете

  

вы привязываетесь к myLabel.DataContext.Name , а не myLabel.Name .

XAML в WPF – это довольно удобный пользовательский интерфейс для отображения и взаимодействия с фактическими данными, иначе известными как DataContext . objective других источников привязки ( RelativeSource , ElementName и т. Д.) ElementName , чтобы указать другое свойство, которое не существует в DataContext текущего DataContext управления


Предположим, у вас есть окно. Без установки DataContext окно все еще отображается, но за ним нет данных.

Теперь предположим, что myWindow.DataContext = new ClassA(); , Теперь данные, отображаемые в окне, – ClassA . Если ClassA имеет свойство Name , я мог бы написать метку и привязать ее к Name (например, вашему примеру), и любое значение, хранящееся в ClassA.Name будет отображаться.

Теперь предположим, что ClassA обладает свойством ClassB и оба classа имеют свойство Name . Вот блок XAML, который иллюстрирует цель DataContext, и пример того, как элемент управления будет ссылаться на свойство, не входящее в его собственный DataContext

                

Как вы можете видеть, DataContext основан на любых данных, находящихся за объектом пользовательского интерфейса.

Обновление. Я так часто вижу этот вопрос у новых пользователей WPF, что я расширил этот ответ в сообщении в своем блоге: « Что это за« DataContext », о котором вы говорите?

В этом конкретном случае вы можете сделать следующее:

  

Предполагая, что вы хотите, чтобы все содержимое ContentSettings содержало настройки в качестве контекста данных. В принципе, DataContext влияет на сам элемент как на потомков, которые явно не переопределяют его.

Из CodeProject Кишоре Гаддама:

DataContext – одна из самых фундаментальных концепций привязки данных. Объект Binding должен получить свои данные откуда-то, и есть несколько способов указать источник данных, например, использовать свойство Source непосредственно в Binding, наследуя DataContext от ближайшего элемента при прохождении в дереве, задав ElementName и RelativeSource в объекте Binding.

Подробный пример в CodeProject: http://www.codeproject.com/Articles/321899/DataContext-in-WPF

В большинстве случаев вы хотите привязываться к DataContext, в некоторых шаблонах на ItemsControls это единственный способ привязки к обычному шаблону, например. Дальнейшие привязки к DataContext приятно писать и читать, поскольку они кратки.

В вашем примере вы можете установить DataContext, вам нужно только изменить привязку в настройках соответственно:

  
  • Почему привязка данных WPF к исключению ласточки?
  • WPF привязка к локальной переменной
  • Можно ли связать свойство Canvas's Children в XAML?
  • Какие подходы доступны для фиктивных данных времени разработки в WPF?
  • Управление несколькими выборами с помощью MVVM
  • Как правильно привязать xml к WPF DataGrid?
  • Связывание WPF ComboBox с пользовательским списком
  • Когда следует использовать # и = в элементах управления ASP.NET?
  • Каковы различные режимы привязки WPF?
  • Нажатие свойств GUI только для чтения обратно в ViewModel
  • Обход проблемы из-за отсутствия оператора 'nameof' в C # для безопасного хранения данных по типу?
  • Давайте будем гением компьютера.