This article has been localized into French by the community.
Utilisation de DataContext
La propriété DataContext est la source par défaut de vos bindings, à moins que vous ne déclariez une autre source explicitement, comme nous l'avons fait dans le chapitre précédent avec la propriété ElementName. Elle est définie dans la classe FrameworkElement dont la plupart des contrôles héritent, y compris le contrôle Window. Le simple fait de le définir permet de spécifier une base pour tous les bindings.
Il n'y a pas de source par défaut pour la propriété DataContext (elle est simplement égale à null au démarrage). Mais étant donné qu'un DataContext est passé par héritage à tous les contrôles enfants, vous pouvez définir un DataContext pour le contrôle Window lui-même et l'utiliser pour tous les contrôles enfants de cette fenêtre. Essayons d'illustrer ça avec un exemple simple :
<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;
}
}
}
La partie Code-behind n'ajoute qu'une ligne de code intéressante : après l'appel standard à InitalizeComponent(), on assigne la référence "this" au DataContext. Ce qui, basiquement, ne fait qu'indiquer à la classe Window que nous voulons qu'il soit lui-même son propre contexte de données.
Dans le XAML, nous utilisons le binding sur plusieurs propriétés de la classe Window, tels que Title, Width et Height. Étant donné que la fenêtre possède un DataContext, qui est passé par héritage à tous les contrôles enfants, nous n'avons pas besoin de définir une source pour chaque binding. Nous utilisons juste les valeurs comme si elles étaient accessibles de manière globale.
Essayez d'exécuter cet exemple et de redimensionner la fenêtre. Vous verrez que le changement de dimensions se reflète immédiatement dans les TextBox. Vous pouvez également essayer d'entrer un titre différent dans la première TextBox, mais vous pourriez être surpris de voir que ce changement ne se reflète pas immédiatement. À la place, vous devez bouger le focus sur un autre contrôle avant que le changement ne soit effectif. Pourquoi ? Eh bien c'est le sujet du prochain chapitre.
Résumé
Utiliser la propriété DataContext revient à définir la base de tous les bindings de tous les contrôles plus bas dans la hiérarchie. Cela vous épargne la peine de définir manuellement une source pour chaque binding. Et une fois que vous commencez réellement à utiliser les data bindings, vous apprécierez définitivement le temps et la saisie épargnée.
Cependant, cela ne signifie pas que vous devez utiliser le même DataContext pour tous vos contrôles à l'intérieur d'une fenêtre. Étant donné que chaque contrôle possède sa propre propriété DataContext, vous pouvez facilement briser la chaine d'héritage et écraser la DataContext avec une nouvelle valeur. Cela vous permet de faire des choses comme avoir un DataContext global pour la fenêtre et ensuite un DataContext plus local et spécifique pour par exemple un panel contenant un formulaire séparé ou quelque chose du genre.