0 votes

Liaison des données du contrôle utilisateur dans Silverlight/MVVM

Les DependencyPropertys ont-ils par défaut une liaison bidirectionnelle ? Si non, comment le spécifier ?

La raison de ma question est que j'ai le contrôle d'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 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 suit : ....

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

Mais les mises à jour de la zone de texte ne sont pas envoyées au modèle.

Si j'utilise la zone de texte standard comme ceci....

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

Ensuite, la liaison de données bidirectionnelle fonctionne parfaitement. Avez-vous une idée de ce qui ne va pas avec mon contrôle ?

A la vôtre,

ETFairfax.

1voto

Bryant Points 7185

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X