2009-10-20 11 views
0

Est-ce que DependencyPropertys utilise la liaison bidirectionnelle par défaut? Si non, comment spécifiez-vous?Liaison de données de contrôle utilisateur dans Silverlight/MVVM

La raison pour laquelle je demande est que j'ai le contrôle utilisateur suivant qui me cause des problèmes ...

<UserControl x:Class="SilverlightApplication.UserControls.FormItem_TextBox" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
> 

<StackPanel Style="{StaticResource FormItem_StackPanelStyle}" > 

    <TextBlock x:Name="lbCaption" Style="{StaticResource FormItem_TextBlockStyle}" /> 
    <TextBox x:Name="tbItem" Style="{StaticResource FormItem_TextBoxStyle}" /> 

</StackPanel> 

Le code derrière pour ce qui est ...

public partial class FormItem_TextBox : UserControl 
{ 

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(string), typeof(FormItem_TextBox), new PropertyMetadata(string.Empty, ValueChanged));  
    public static readonly DependencyProperty CaptionProperty = DependencyProperty.Register("Caption", typeof(string), typeof(FormItem_TextBox), new PropertyMetadata(string.Empty, CaptionChanged)); 

    public string Value 
    { 
     get { return (String)GetValue(ValueProperty); } 
     set { SetValue(ValueProperty, value); } 
    } 

    public string Caption 
    { 
     get { return (String)GetValue(CaptionProperty); } 
     set { SetValue(CaptionProperty, value); } 
    } 

    private static void ValueChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
    { 
     (source as FormItem_TextBox).tbItem.Text = e.NewValue.ToString(); 
    } 

    private static void CaptionChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
    {   
     (source as FormItem_TextBox).lbCaption.Text = e.NewValue.ToString(); 
    } 

    public FormItem_TextBox() 
    { 
     InitializeComponent(); 
    } 

} 

Dans ma page, j'utilise le contrôle comme ceci ....

<UC:FormItem_TextBox Caption="First Name: " Value="{Binding Path=FirstName, Mode=TwoWay}" /> 

Mais aucune mise à jour de la zone de texte n'est envoyée au modèle.

Si j'utilise la boîte de texte standard comme celui-ci ....

<TextBlock Text="Firstname:"/> 
<TextBox Text="{Binding Path=FirstName, Mode=TwoWay}" /> 

Ensuite, la liaison de données à deux voies fonctionne perfecly. Des idées ce qui ne va pas avec mon contrôle?

Cheers,

ETFairfax.

Répondre

1

Dans votre contrôle utilisateur, vous n'avez aucun moyen de savoir quand la valeur dans la zone de texte a été mise à jour. Vous devez ajouter un gestionnaire d'événements pour l'événement TextChanged dans la zone de texte tbItem, puis définir la valeur de la propriété Value avec la nouvelle valeur.

+0

Merci pour la réponse Bryant. Je pensais que ça allait être quelque chose comme ça, mais je le trouvais un peu bizarre parce que, le ValueChanged a (source comme FormItem_TextBox) .tbItem.Text = e.NewValue.ToString(); ... quel genre de sentiment que j'allais être en boucle ronde; Est-ce que tu vois ce que je veux dire? Quoi qu'il en soit, ce que vous avez suggéré fonctionne, alors c'est tout ce qui compte !!! Merci. – ETFairfax

+0

Le ValueChanged est de la machine virtuelle au contrôle. Le gestionnaire TextChanged est pour revenir dans l'autre sens. – Bryant

Questions connexes