This article has been localized into Portuguese by the community.
Usando o DataContext
A propriedade DataContext é a fonte padrão de seus bindings, a menos que você especificamente declare outra fonte, como nós fizemos no capítulo anterior com a propriedade ElementName. Ela é definida na classe FrameworkElement, que a maioria dos controles UI, incluíndo o Window WPF, herda. Simplificando, ele te permite especificar a base para seus bindings.
Não existe uma fonte padrão para a propriedade DataContext (ela simplesmente é nula ao iniciar), mas uma vez que o DataContext é herdado através da hierarquia do controle, você pode definir um DataContext para o próprio Window e então usá-lo ao longo de todos controles filhos. Vamos tentar ilustrar isso com um simples exemplo:
<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;
}
}
}
O CodeBehind para este exemplo apenas adiciona uma linha de código interessante: Depois da chamada padrão InitializeComponent(), nós assinamos o DataContext referenciando o com o "this", que basicalmente permite dizer para o Window que nos queremos que ele seja o contexto de dado.
No XAML, nós usamos esse fato para vincular várias propriedades da janela, incluindo o Título, Largura e Altura. Já que a janela tem um DataContext, que é passado para os controles filhos, nós não temos que definir uma fonte em cada um dos vínculos - nós apenas usamos os valores como se eles estivessem disponíveis globalmente.
Tente executar o exemplo e redimensionar a janela - você verá que as alterações de dimensão são imediatamente refletidas nos campos de textos. Você também pode escrever um título diferente no primeiro campo de texto, mas você pode se surpreender ao ver que essa alteração não reflete imediatamente. Ao invés disso, você tem que mover o foco para outro controle antes das mudanças serem aplicadas. Porquê? Bem, isso é assunto para o próximo capítulo.
Resumo
Ao usar a propriedade DataContext é como se definisse a base para todos os vínculos através da hierarquia dos controles. Isso te ajuda a evitar confusão ao definir manualmente uma fonte para cada vínculo, e uma vez que você realmente começa usar data bindings, você irá definitivamente apreciar a economia de tempo e escrita.
Porém, isso não significa que você tem que usar o mesmo DataContext para todos os controles dentro da janela. Visto que cada controle tem sua própria propriedade DataContext, você pode facilmente quebrar a corrente da herança e sobrescrever o DataContext com um novo valor. Isso te permite fazer coisas tendo um DataContext global na janela e um DataContext mais específico local por exemplo um painel alocando um formulário separado ou algo nesse sentido.