2009-03-09 10 views
1

J'ai un contrôle utilisateur personnalisé nommé champ:Silverlight contrôles personnalisés de l'utilisateur et la propriété Dépendance d'émission

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <TextBlock Grid.Row="0" Grid.Column="0" Name="LblName"/> 
    <TextBox Grid.Row="0" Grid.Column="1" HorizontalContentAlignment="Left" Name="TxtValue"/> 
</Grid> 

Dans le fichier CS I expose la propriété ci-dessous qui définit simplement la valeur « .text » de la zone de texte.

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
     "Value", 
     typeof(string), 
     typeof(Field), 
     new PropertyMetadata(
      default(string), 
      (source, args) => (source as Field).TxtValue.Text = (string)args.NewValue 
     ) 
    ); 

    [Category("Custom")] 
    public string Value 
    { 
     get 
     { 
      return (string)this.GetValue(ValueProperty); 
     } 
     set 
     { 
      this.SetValue(ValueProperty, value); 
     } 
    } 

Première question. Est-ce la manière correcte de propager les propriétés de dépendance du contrôle utilisateur enfant, de sauvegarder via le contrôle utilisateur parent afin qu'il puisse être défini à partir de la page xaml? J'ai jeté un coup d'œil sur le net, il n'y a pas grand-chose là-bas étant donné que c'est une chose assez primitive quand on écrit des contrôles personnalisés.

En donnant des détails autour de la vue d'ensemble, j'ai la page des détails du client, certains contrôles sont liés à l'objet client qui est contenu dans une collection observable. Si je change la valeur de la zone de texte (qui est contenue dans le contrôle de champ) sur la page de "xxxx" à "yyyy" je reçois toujours "xxxx". Il semble que quelque chose ne va pas quelque part autour du getter?

Répondre

1

Ceci est certainement un pas dans la bonne direction pour permettre aux propriétés de se propager.

S'il s'agit d'un véritable contrôle personnalisé (dérive de Control), vous devez utiliser un {TemplateBinding Value} et vous devriez probablement également vous connecter à l'événement TextChanged sur la TextBox, après avoir configuré la partie template dans la méthode OnApplyTemplate. De cette façon, vous pouvez également mettre à jour votre propriété de dépendance TxtValue sous-jacente.

S'il s'agit d'un contrôle UserControl, vous pouvez utiliser la liaison, mais vous disposez de moins d'options. Comme vous l'avez, votre propriété a changé fonction de rappel ne va que dans une direction: vous ne définissez que la valeur du texte, vous n'y réagissez jamais.

Espérons que la documentation s'améliorera.

Questions connexes