Définition de propriétés personnalisées dans UserControl via DataBinding
Dire que j'ai un très simple UserControl que, pour toutes fins utiles, - n'est rien de plus que la zone de texte:
public partial class FooBox : UserControl
{
public static readonly DependencyProperty FooTextProperty =
DependencyProperty.Register("FooText", typeof(string), typeof(FooBox));
public FooBox()
{
InitializeComponent();
}
public string FooText
{
get { return textBlock.Text; }
set { textBlock.Text = value; }
}
}
<UserControl x:Class="Namespace.FooBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<Grid>
<TextBlock x:Name="textBlock" />
</Grid>
</UserControl>
Sur la forme, il est déclaré que:
<local:FooBox FooText="{Binding Name}" />
La forme du DataContext est défini pour un objet qui a un Nom de propriété. Mais ce n'est pas de travail pour moi. Ce qui me manque?
source d'informationauteur xanadont
Vous devez vous connecter pour publier un commentaire.
Le "get" et "set", les pièces d'une déclaration de propriété dans une DependencyProperty ne sont pas réellement appelé par la liaison de données du système de WPF - ils sont là essentiellement pour satisfaire le compilateur.
Au lieu de cela, modifier votre déclaration de propriété pour ressembler à ceci:
... et votre code XAML:
Maintenant votre zone de texte.Texte simplement se lie directement à la "FooText" de la propriété, de sorte que vous pouvez ensuite lier le FooText à la propriété "Nom" comme vous êtes en train de faire.
Une autre façon est de se lier à TextBlock.Texte à un RelativeSource de liaison qui trouve la FooText bien sur le premier ancêtre de type "FooBox", mais j'ai trouvé que c'est plus complexe que juste de donner le contrôle interne x:Nom et à l'aide de l'élément de liaison.
S'avère que le vrai problème c'est que je m'attendais à du framework WPF pour configurer ma propriété publique, après quoi mon code pour répondre aux changements et de rendu en fonction de la nouvelle valeur. De ne pas faire. Ce WPF ne fait qu'appeler SetValue() directement et complètement contourne la propriété publique. Ce que j'avais à faire était de recevoir des biens de notifications de changement à l'aide de DependencyPropertyDescriptor.AddValueChanged et de répondre à cela. Il ressemble à quelque chose comme (à l'intérieur de la ctor):