This article is currently in the process of being translated into Croatian (~99% done).
Using the DataContext
Svojstvo DataContext je zadani izvor kod povezivanja podataka, osim ako specifično ne deklarirate drugi izvor, kao što smo to učinili u prethodnom poglavlju sa svojstvom ElementName. Ono je definirano na klasi FrameworkElement, koju nasljeđuje većina kontrola grafičkog sučelja, uključujući WPF Window. Jednostavno rečeno, omogućuje vam da specificirate temelj za vaše veze.
Ne postoji zadani izvor podataka za DataContext svojstvo (u startu je null), ali s obzirom da se DataContext nasljeđuje kroz hijerarhiju kontrola, možete postaviti DataContext na sami Window i onda ga koristiti u svim kontrolama koje ga nasljeđuju. Ilustrirajmo to jednostavnim primjerom:
<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;
}
}
}
Pozadinski kod za ovaj primjer samo dodaje jednu zanimljivu liniju koda: Nakon standardnog poziva InitalizeComponent() metode dodjeljujemo "this" referencu DataContextu, što u principu govori Windowu da želimo da on sam bude kontekst za podatke.
U XAML-u koristimo ovu činjenicu kako bismo se povezali s nekoliko svojstava Windowa, uključujući Title, Width i Height. S obzirom da prozor ima DataContext koji se prosljeđuje kontrolama koji se iz njega izvode, ne moramo definirati izvor za svaku od veza - samo koristimo vrijednosti kao da su one globalne dostupne.
Pokušajte pokrenuti ovaj primjer i promijeniti veličinu prozora - vidjet ćete da se izmjene u dimenzijama odmah prikazuju u textboxevima. Također možete upisati drugačiji naslov u prvi textbox, ali će vas možda iznenaditi kad vidite da se promjena neće odmah odraziti. Kako bi došlo do promjene prvo morate prebaciti fokus na neku drugu kontrolu. Zašto? Pa, to je tema za iduće poglavlje.
Sažetak
Korištenje svojstva DataContext je poput postavljanja temelja za sve veze kroz hijerarhiju kontrola. Ovo vas štedi gnjavaže ručnog definiranja izvora za svaku vezu, a jednom kada zaista počnete koristiti veze podataka, sigurno ćete cijeniti vrijeme i tipkanje koje ste uštedjeli.
Međutim, ovo ne znači da morate koristiti isti DataContext za sve kontrole unutar Prozora. S obzirom da svaka kontrola ima vlastito DataContext svojstvo možete jednostavno prekinuti lanac nasljeđivanja i pregaziti DataContext s novom vrijednosti. To vam omogućuje da primjerice imate globalni DataContext na prozoru i da imate lokalni, specifičniji DataContext na npr. panelu koji sadrži zaseban obrazac ili nešto slično.