O que é DataContext para?

Como continuação da pergunta Linking DataContext com outra propriedade no WPF .

No final da pesquisa fiquei muito surpreso ao descobrir que quando alguém escreve algo assim:

 

O DataContext contra o qual a propriedade Content está vinculada é do próprio controle Label ! O fato de que ele ainda funciona é devido à inheritance padrão do valor DataContext do pai mais próximo.

Mas se você tiver esse label agrupado em um controle personalizado e não quiser vincular seus dados à propriedade DataContext desse controle, você provavelmente adoraria ter:

  

E aqui está você. Agora você precisa definir Settings como o DataContext para o controle SearchSettings , para Label dentro para vincular, mas você não pode, porque isso irá desencadear re-binding da propriedade Settings .

Eu não consigo ver o ponto em misturar propriedades de binding usando fonts diferentes: DataContext , por ElementName , etc. Então, por que eu nunca usaria DataContext ?

Quando você escreve

  

você está vinculando a myLabel.DataContext.Name e não a myLabel.Name .

O XAML no WPF é apenas uma bonita interface de usuário para exibir e interagir com os dados reais, também conhecidos como DataContext . O objective de outras fonts de binding ( RelativeSource , ElementName , etc) é apontar para outra propriedade que não existe no DataContext do controle atual


Então, suponha que você tenha uma janela. Sem definir o DataContext, a janela ainda é exibida, mas não há dados por trás dela.

Agora, suponha que para definir myWindow.DataContext = new ClassA(); . Agora os dados que a janela está exibindo é ClassA . Se ClassA tiver uma propriedade chamada Name , eu poderia escrever um label e vinculá-lo a Name (como seu exemplo) e qualquer valor armazenado em ClassA.Name seria exibido.

Agora, suponha que ClassA tenha uma propriedade de ClassB e ambas as classs tenham uma propriedade chamada Name . Aqui está um bloco de XAML que ilustra a finalidade do DataContext e um exemplo de como um controle se referiria a uma propriedade não em seu próprio DataContext

                

Como você pode ver, o DataContext é baseado em qualquer dado que esteja por trás do object UI.

Update: Eu vejo essa pergunta com tanta freqüência de novos usuários do WPF que eu expandi essa resposta em um post no meu blog: O que é esse “DataContext” de que você fala?

Nesse caso em particular, você poderia fazer:

  

Supondo que você quer tudo o que pode ser conteúdo do SearchSettings para usar configurações como seu contexto de dados. Basicamente, o DataContext afeta o próprio elemento e os descendentes que não o substituem explicitamente.

De CodeProject by kishore Gaddam:

DataContext é um dos conceitos mais fundamentais na vinculação de dados. O object Binding precisa obter seus dados de algum lugar, e existem algumas maneiras de especificar a origem dos dados, como usar a propriedade Source diretamente no Binding, herdando um DataContext do elemento mais próximo ao percorrer a tree, definindo o ElementName e propriedades RelativeSource no object Binding.

Exemplo detalhado no CodeProject: http://www.codeproject.com/Articles/321899/DataContext-in-WPF

Na maioria dos casos você deseja vincular ao DataContext, em alguns modelos no ItemsControls é a única maneira de vincular ao item de modelo atual, por exemplo. Outras ligações para o DataContext são boas para escrever e ler como são concisas.

No seu exemplo, você ainda pode definir o DataContext, você só precisa modificar a binding nas configurações, respectivamente: