Для чего нужен DataContext?
В качестве продолжения вопроса связывается DataContext с другим свойством в WPF .
В самом конце исследования я был очень удивлен, узнав, что когда что-то пишет:
DataContext
с которым связано свойство Content
принадлежит самому методу Label
! Тот факт, что он все еще работает, связан с наследованием по умолчанию значения DataContext от ближайшего родителя.
- Принуждение WPF TextBox больше не работает в .NET 4.0
- Связывание в WPF с элементом массива, заданным свойством
- Привязка данных Android с использованием тега include
- WPF перед записью
- Привязать к методу в WPF?
Но если у вас есть этот ярлык, завернутый в пользовательский элемент управления, и вы не хотите привязывать свои данные к свойству DataContext
элемента управления, вам, скорее всего, понравится:
И ты здесь. Теперь вам нужно установить « Settings
в качестве DataContext
для SearchSettings
управления SearchSettings
, для Label
внутри для привязки, но вы не можете, потому что это вызовет повторное связывание свойства Settings
.
Я не вижу смысла в смешивании свойств привязки с использованием разных источников: DataContext
, ElementName
и т. Д. Так почему бы мне использовать DataContext
?
- Как я могу привязать данные строк к ListBox в WPF / WP7?
- ItemsControl с несколькими DataTemplates для viewmodel
- Связывание Richtextbox wpf
- WPF MVVM INotifyPropertyChanged Implementation - модель или ViewModel
- Как обнаружить сломанные привязки данных WPF?
- Перетаскивание из источника данных в окно WPF не работает
- Должен ли я привязываться к ICollectionView или ObservableCollection
- WPF привязка данных к интерфейсу, а не к фактическому объекту - возможность литья?
Когда вы пишете
вы привязываетесь к 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, вам нужно только изменить привязку в настройках соответственно: