TOC

This article has been localized into Polish by the community.

Powiązanie danych:

Korzystanie z kontekstu danych (DataContext)

Właściwość DataContext jest domyślnym źródłem dla twoich wiązań, chyba że samemu zmienisz źródło na inne, tak jak to zrobiliśmy w poprzednim rozdziale z właściwością ElementName. Właściwość ta jest określona w klasie FrameworkElement, po której dziedziczy większość klas interfejsu użytkownika w WPF, włączając w to między innymi okna. Mówiąc prościej: pozwala na określenie podstawy dla twoich wiązań.

Domyślną wartością właściwości DataContext jest null, czyli nic, jednak, ponieważ DataContext jest dziedziczony w dół hierarchii kontrolek, możesz nadać wartość DataContext tylko dla Okna i następnie używać jej we wszystkich podległych kontrolkach. Pokażemy to na prostym przykładzie:

<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;
		}
	}
}

W tym przykładzie kod za-widokiem dodaje tylko jedną, interesującą nas, linię: zaraz za wywołaniem InitializeComponent() przypisujemy odwołanie do „this” (ten obiekt) do właściwości DataContext, co powoduje, że nasze okno (Window) wie, że samo sobie jest kontekstem dla danych.

W XAML wykorzystujemy tą możliwość po to, aby wiązać kilka właściwości Okna, włączając w to tytuł (Title), szerokość (Width) i wysokość (Height). Ponieważ okno ma ustawiony DataContext, który jest przekazywany w dół do podrzędnych kontrolek, nie musimy określać źródła na każdym z wiązań – używamy po prostu wartości w taki sposób, jakby były dostępne globalnie.

Uruchom przykład i zmień rozmiar okna - zobacz jak zmiana wymiarów jest momentalnie odwzorowywana w TextBox'ach. Spróbuj także zmienić tytuł w pierwszym polu tekstowym. Możesz być zaskoczony tym, że nowy tytuł nie jest stosowny od razu tylko dopiero po przeniesieniu zaznaczenia na inna kontrolkę. Dlaczego? Cóż, jest to material na osobny rodzial.

Podsumowanie

Korzystanie z właściwości DataContext jest niejako podstawą dla wszystkich powiązań biegnących w dół przez całą hierarchię kontrolek. Dzięki temu nie trzeba definiować źródeł dla każdego powiązania i jak tylko zaczniesz z tego korzystać, z całą pewnością docenisz zaoszczędzony dzięki temu czas.

Nie oznacza to jednak, że musisz korzystać z tego samego kontekstu danych dla wszystkich kontrolek w oknie. Ponieważ każda kontrolka posiada właściwość DataContext, łatwo możesz złamać łańcuch dziedziczenia i nadpisać Kontekst danych nową wartością. Umożliwia to robienie rzeczy takich jak, ustawienie globalnego kontekstu danych dla okna i jednocześnie bardziej lokalnych i konkretnych kontekstów danych dla pojedynczych kontrolek, np panelu zawierającego formularz.


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!