Dans la suite de la question Linking DataContext with another property in WPF.À quoi sert DataContext?
J'ai été très surpris de la fin de la recherche pour savoir que quand on écrit quelque chose comme ça:
<Label Content="{Binding Path=Name}" />
La DataContext
contre laquelle la propriété est Content
binded est du contrôle Label
lui-même! Le fait qu'il fonctionne toujours est dû à l'héritage par défaut de la valeur DataContext du parent le plus proche.
Mais si vous avez cette étiquette enveloppée dans un contrôle personnalisé, et vous ne voulez pas lier vos données à la propriété DataContext
de ce contrôle, vous aimeriez plus susceptibles d'avoir:
<Controls:SearchSettings Settings="{Binding Path=Settings}" />
Et vous voilà. Maintenant, vous devez définir Settings
comme DataContext
pour le contrôle SearchSettings
, pour Label
à l'intérieur de lier, mais vous ne pouvez pas, car cela déclenchera re-liaison de la propriété Settings
.
Je ne vois pas le point dans le mélange des propriétés de liaison en utilisant différentes sources: DataContext
, par ElementName
, etc. Alors, pourquoi aurais-je jamais utiliser DataContext
?
Salut! Merci pour la réponse détaillée. Mais. Ce que je n'aime pas dans votre exemple, c'est que vous liez la propriété DataContext elle-même. Très probablement j'extrais StackPanel dans votre exemple dans un contrôle séparé. Cela a du sens si son DataContext est juste une partie isolée de DataContext de son parent, n'est-ce pas? Et puis je ne lierais pas la propriété DataContext de mon contrôle utilisateur, mais aurais plutôt une propriété spéciale avec un nom auto-descriptif. (Je veux dire ce qui est un DataContext pour un contrôle particulier? Que dois-je passer?) Et c'est là que les choses se compliquent. [A suivre] –
Comme je ne lierais pas la propriété DataContext, elle serait prise d'un contrôle parent. Ce qui signifie que je ne suis plus capable de lier des contrôles dans mon contrôle personnalisé sur DataContext, juste parce que je ne sais pas ce qu'il y a dedans (le contrôle ne peut pas contrôler l'enfant et le DataContext qu'il recevra). La solution pourrait être de définir DataContext de l'intérieur pour contrôler (en utilisant une valeur de cette propriété spéciale). [A suivre] –
Mais cela va casser la liaison du contrôle lui-même, car, comme vous l'avez souligné, ayant écrit 'Content = {Binding Name}' on se lie à 'Label.DataContext.Name' et non' Label.Parent. DataContext.Name' comme je m'attendais à le faire. –