2011-06-21 5 views
0

Dans mon code, j'ai déclaré, dans le ValidatingTextBox de contrôle personnalisé, la propriété de dépendance suivante:problème avec DependencyProperty contrôle personnalisé

public DependencyProperty visibleText = DependencyProperty.RegisterAttached("visText", typeof(String), typeof(ValidatingTextBox)); 
public String visText 
{ 
    get { return theBox.Text; } 
    set { theBox.Text = value; } 
} 

Mais lorsque je tente d'utiliser le XAML

<local:ValidatingTextBox> 
    <ValidatingTextBox.visibleText> 

    </ValidatingTextBox.visibleText> 
</local:ValidatingTextBox> 

il dit qu'une telle dépendance n'existe pas dans ValidatingTextBox. Qu'est-ce que je fais mal? Existe-t-il un meilleur moyen d'interagir avec la zone de texte enfant de mon contrôle personnalisé?

Répondre

1

Dans la méthode de registre que vous avez enregistré comme visText, le nom du champ n'a rien à voir avec la propriété elle-même. Vous semblez également définir une propriété attachée qui va être utilisée comme une propriété normale, vous devez le définir comme une propriété de dépendance normale.

En outre, vous créez deux propriétés, une propriété de depedency sans-wrapper CLR et une propriété normale en faisant ceci:

public String visText 
{ 
    get { return theBox.Text; } 
    set { theBox.Text = value; } 
} 

Il n'a rien à voir avec la valeur de votre propriété réelle depedency car elle accède à jamais il. En outre, le champ de propriété doit être statique et en lecture seule.

La lecture à travers le Depedency Properties Overview est conseillée car c'est tout à fait un gâchis, aussi jetez un oeil à the article on creating custom dependency properties qui devrait être très utile. Pour répondre à votre question sur l'interaction avec les contrôles enfants: Créez des propriétés de dépendance (appropriées) et attachez-les.

Puisque la propriété existe déjà sur l'enfant, vous pouvez également le réutiliser avec AddOwner:

public static readonly DependencyProperty TextProperty = 
    TextBox.TextProperty.AddOwner(typeof(MyControl)); 
public string Text 
{ 
    get { return (string)GetValue(TextProperty); } 
    set { SetValue(TextProperty, value); } 
} 
<!-- Assuming a usercontrol rather than a custom control --> 
<!-- If you have a custom control and the child controls are created in code you can do the binding there --> 
<UserControl ... 
     Name="control"> 
    <!-- ... --> 
    <TextBox Text="{Binding Text, ElementName=control}"/> 
    <!-- ... --> 
</UserControl> 
Questions connexes