TOC

This article is currently in the process of being translated into Russian (~97% done).

Связывание данных:

Using the DataContext

Свойство DataContext по умолчанию является источником ваших привязок в случае, если вы не указали другой источник, как мы сделали в предыдущей главе со свойством ElementName. Это свойство определено в классе FrameworkElement, от которого наследуется большинство элементов управления, включая класс Window. Проще говоря, оно позволяет вам указать основу для ваших привязок.

Свойство DataContext не имеет источника по умолчанию (изначально оно попросту установлено в null), но так как контекст данных наследуется вниз по иерархии элементов управления, вы можете установить DataContext для элемента Window, а затем использовать его в любом дочернем элементе. Покажем это на простом примере:

<Window x:Class="WpfTutorialSamples.DataBinding.DataContextSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataContextSample" Height="130" Width="280">
	<StackPanel Margin="15">
		<WrapPanel>
			<TextBlock Text="Window title:  " />
			<TextBox Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}" Width="150" />
		</WrapPanel>
		<WrapPanel Margin="0,10,0,0">
			<TextBlock Text="Window dimensions: " />
			<TextBox Text="{Binding Width}" Width="50" />
			<TextBlock Text=" x " />
			<TextBox Text="{Binding Height}" Width="50" />
		</WrapPanel>
	</StackPanel>
</Window>
using System;
using System.Windows;

namespace WpfTutorialSamples.DataBinding
{
	public partial class DataContextSample : Window
	{
		public DataContextSample()
		{
			InitializeComponent();
			this.DataContext = this;
		}
	}
}

Код "за сценой" в этом примере добавляет единственную интересную строку: после стандартного вызова InitalizeComponent(), мы присваиваем ссылку на this переменной DataContext, которая просто говорит Window, что мы хотим использовать собственные данные в качестве контекста.

В XAML, мы используем этот факт для привязки к нескольким свойствам Window, включая Title, Width и Height.. Поскольку окно имеет DataContext, который передается дочерним элементам управления, мы не должны определять источник для каждой из привязок, мы просто используем значения, как если бы они были общедоступными доступными.

Попробуйте запустить пример и изменить размер окна, вы увидите, что размер окна немедленно меняются в текстовом поле. Вы также можете попробовать написать другое название в первом текстовом поле, но вы можете быть удивлены, узнав, что это изменение не отражается немедленно. Вместо этого необходимо переместить фокус на другой элемент управления перед применением изменения. Почему? Ну, это тема для следующей главы.

Краткое изложение

Использование свойства DataContext подобно установке основы всех привязок вниз по иерархии элементов управления. Это избавит вас от хлопот вручную определяя источник для каждой привязки, и как только вы действительно начнёте использовать привязки данных, вы наверняка оцените сохранённое время и удобсвто использования.

Однако это не означает, что необходимо использовать один и тот же DataContext для всех элементов управления в Window. Поскольку каждый элемент управления имеет собственное свойство DataContext, можно легко разорвать цепочку наследования и переопределить DataContext новым значением. Это позволяет делать такие вещи, как иметь глобальный DataContext в окне, а затем более локальный и конкретный DataContext, например, панель, которая держит раздельную форму или что-то в этом направлении.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!