Согласно ответам на ваш последний вопрос , DataContext - это объект, который ваши привязки будут использовать в качестве источника данных.
Когда я предложил установить DataContext для страницы или элемента управления (ниже, в исходном ответе), это было связано с тем, что вам не нужно было указывать свойство Source
в привязке, как указано в исходном вопросе.
Пример - Вместо того, чтобы указывать привязку как:
{Binding Path=PropertyName, RelativeSource={RelativeSource AncestorType={x:Type ns:ControlName}}}
вы могли бы просто использовать
{Binding Path=PropertyName}
в качестве свойства контейнеров DataContext
было установлено значение ControlName
(это только в том случае, если вы укажете DataContext = this
, , а не DataContext = this.DataContext
, так как это будет просто устанавливать его себе и быть бессмысленным).
Теперь для Page
или Window
объектов PropertyName
может быть либо экземпляром DependencyProperty
регистра, либо стандартом Property
, который вызвал событие INotifyPropertyChanged.PropertyChanged
, чтобы уведомить детей в XAML, что свойство изменилось, и они обновляют себя по мере необходимости.
Для Control
объектов вы все равно можете использовать любой метод - однако, если вы хотите иметь возможность привязки к этим свойствам, их нужно будет определить как DependencyProperty
s.
Можете ли вы обновить ваше сообщение с любым источником, чтобы мы могли найти его для вас?
<ч />
Оригинальный ответ:
Я не совсем уверен, что понимаю вашу конечную цель, но самый ленивый способ указать DataContext для ваших элементов управления - это установить свойство DataContext страницы в конструкторе на себя.
this.DataContext = this;
Это устраняет необходимость устанавливать свойства Source и RelativeSource в вашей привязке, в то же время позволяя вам связывать напрямую со свойствами страницы.
* +1054 * Пример:
public class MyControl : UserControl
{
public static readonly DependencyProperty SomeStringProperty = DependencyProperty.Register("SomeString", typeof(string), typeof(ownerclass), new UIPropertyMetadata(0));
public string SomeString
{
get { return (string)GetValue(SomeStringProperty); }
set { SetValue(SomeStringProperty, value); }
}
public MyControl()
{
InitializeComponent();
DataContext = this;
}
}
Тогда в вашем XAML:
<TextBlock Text="{Binding Path=SomeString}" />