This article is currently in the process of being translated into Bulgarian (~98% done).
Използване на DataContext
Свойството DataContext е източникът по подразбиране на обвързванията, освен ако изрично не декларирате друг източник, както направихме в предишната глава чрез свойството ElementName. Той е дефиниран в класа FrameworkElement, от който повечето UI контроли, включително дори WPF Window, наследяват. Казано по-просто, това ви позволява да посочите основа за вашите обвързвания
Няма източник по подразбиране за свойството DataContext (то просто е null от самото начало), но тъй като DataContext се наследява надолу през йерархията на контролите, можете да зададете DataContext за самия прозорец и след това да го използвате във всички дъщерни контроли. Нека се опитаме да илюстрираме това с прост пример:
<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;
}
}
}
Кода (Code-behind) за този пример добавя само един ред интересен код: след стандартното извикване InitalizeComponent(), ние присвояваме препратката „this“ към DataContext, което по същество просто казва на Window, че искаме самият той да бъде контекстът на данните.
В XAML използваме този факт, за да се свържем с няколко от свойствата на прозореца - заглавие, ширина и височина. Тъй като прозорецът има DataContext, който се предава на дъщерните контроли, не е нужно да дефинираме източник за всяко от обвързванията - ние просто използваме стойностите, сякаш са глобално достъпни.
Опитайте да стартирате примера и преоразмерите прозореца - ще видите, че промените в размерите веднага се отразяват в текстовите полета. Можете също да опитате да напишете различно заглавие в първото текстово поле, но може да се изненадате да видите, че тази промяна не се отразява веднага. Вместо това трябва да преместите фокуса върху друга контрола, преди промяната да бъде приложена. Защо? Е, това е темата за следващата глава.
Обобщение
Използването на свойството DataContext е като задаване на основата на всички обвързвания надолу през йерархията на контролите. Това ви спестява ръчното дефиниране на източник за всяко обвързване и след като наистина започнете да използвате обвързването на данни, определено ще оцените спестеното време и писане.
Това обаче не означава, че трябва да използвате един и същ DataContext за всички контроли в един прозорец. Тъй като всяка контрола има собствено свойство DataContext, можете лесно да прекъснете веригата на наследяване и да замените DataContext с нова стойност. Това ви позволява да правите неща като да имате глобален DataContext в прозореца и след това по-локален и специфичен DataContext на напр. панел, който държи отделен формуляр или нещо подобно.