This article has been localized into Russian by the community.
Использование свойства 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;
}
}
}
Код в этом примере добавляет единственную существенную строку: после стандартного вызова InitializeComponent() мы присваеваем ссылку "this" свойству DataContext, что сообщает элементу Window о нашем желании установить в качестве контекста данных его самого.
В XAML, мы используем этот факт для привязки к нескольким свойствам Window, включая Title, Width и Height.. Поскольку окно имеет DataContext, значение которого передается дочерним элементам управления, нам не нужно определять источник для каждой из привязок, мы просто используем значения свойств, как если бы они были публично доступными.
Попробуйте запустить пример и изменить размер окна — вы увидите, что его изменения мгновенно отобразятся в текстовых полях. Вы также можете попробовать написать другой заголовок в первом текстовом поле, но возможно вы будете удивлены тому, что сам заголовок окна не меняется. Для этого вам нужно будет сместить фокус на другой элемент, чтобы он изменился. Почему так происходит? Что же, это тема уже для следующей главы.
Заключение
Использование свойства DataContext подобно установке основы всех привязок вниз по иерархии элементов управления. Вам не нужно будет вручную определять источник для каждой привязки, и как только вы действительно начнёте использовать привязки данных, вы наверняка оцените сохранённое время и удобство использования.
Однако это не означает, что необходимо использовать один и тот же DataContext для всех элементов управления в Window. Поскольку каждый элемент управления имеет собственное свойство DataContext, можно легко разорвать цепочку наследования и переопределить DataContext новым значением. Это позволяет делать такие вещи, как иметь глобальный DataContext в окне, а затем более локальный и конкретный DataContext, например, панель, которая держит раздельную форму или что-то в этом направлении.