2011-03-03 4 views
0

J'ai configuré un simple contrôle Silverlight 4 qui est censé changer la visibilité de deux zones de texte basées sur une propriété publique. J'ajoute le contrôle à une vue et positionne la liaison de données de la propriété du contrôle à une propriété du viewmodel de la vue parent. Lorsqu'une modification de la propriété du viewmodel parent a lieu, rien ne se passe dans le contrôle usercontrol. Bien qu'il soit lié, le OnPropertyChanged ne semble pas intéresser la propriété liée du contrôle utilisateur. Voici le code du contrôle de l'utilisateur.Silverlight 4 La propriété Usercontrol ne parvient pas à recevoir PropertyChanged du contrôle parent

<UserControl x:Class="Controls.EAPPasswordBox" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400" x:Name="_root" > 

<Grid x:Name="LayoutRoot" Background="White"> 
    <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Top"> 
     <PasswordBox x:Name="pwdBox" /> 
     <TextBox x:Name="txtBox" /> 
    </StackPanel> 
</Grid> 

public partial class EAPPasswordBox : UserControl, INotifyPropertyChanged 
{ 
    public bool ShowText 
    { 

     get { return (bool)GetValue(ShowTextProperty); } 
     set { 

      SetValue(ShowTextProperty, value); 
       if (value == true) 
       { 
        this.pwdBox.Visibility = System.Windows.Visibility.Collapsed; 
        this.txtBox.Visibility = System.Windows.Visibility.Visible; 
       } 
       else 
       { 
        this.pwdBox.Visibility = System.Windows.Visibility.Collapsed; 
        this.txtBox.Visibility = System.Windows.Visibility.Visible; 
       } 
     } 

    } 

    private Visibility _PwdBoxVisibility; 

    public Visibility PwdBoxVisibility 
    { 
     get { return _PwdBoxVisibility; } 
     set 
     { 
      _PwdBoxVisibility = value; NotifyPropertyChanged("PwdBoxVisibility"); 
     } 
    } 

    private Visibility _TxtBoxVisibility; 

    public Visibility TxtBoxVisibility 
    { 
     get { return _TxtBoxVisibility; } 
     set 
     { 
      _TxtBoxVisibility = value; NotifyPropertyChanged("TxtBoxVisibility"); 
     } 
    } 


    public static readonly DependencyProperty ShowTextProperty = 
     DependencyProperty.Register("ShowText", typeof(bool), typeof(EAPPasswordBox),null); 

    public EAPPasswordBox() 
    { 
     InitializeComponent(); 
    } 

    private static void OnShowTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 

    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

} 

Voici comment je l'utilise à mon avis parent:

<local:EAPPasswordBox x:Name="pwdBox" 
       Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="2" ShowText="{Binding showPassword, Mode=TwoWay}"></local:EAPPasswordBox> 


private bool _showPassword; 
    public bool showPassword 
    { 
     get 
     { 
      return _showPassword; 
     } 
     set 
     { 
      _showPassword = value; 
      RaisePropertyChanged("showPassword"); 
     } 
    } 

Lorsque le "showPassword" dans les changements de ViewModel de vue parent, rien ne se passe dans le contrôle de l'utilisateur , et ça me rend fou :) Des idées? Je vous remercie.

+0

Lorsque j'ai défini ShowText = "False" dans le local: EAPPasswordBox il intervient dans la propriété ShowText et lorsque j'inspecte le DataContext via Visual Studio à ce stade, il dit qu'il est null. Peut-être que ça aide. – hoetz

Répondre

1

Les mises à jour des dépendances liées ne se produisent pas avec les accesseurs get/set normaux de la propriété mais derrière les scènes. En tant que tel, la seule façon d'intercepter lorsque la valeur est modifiée est de fournir un DependencyPropertyChangedEventHandler dans PropertyMetadata lorsque vous créez la propriété Dependency.

Comme suit:

 

public static readonly DependencyProperty ShowTextProperty = 
     DependencyProperty.Register("ShowText", typeof(bool), typeof(EAPPasswordBox), new PropertyMetadata(ShowTextPropertyChanged)); 

private static void ShowTextPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
{ 
    EAPPasswordBox passwordBox = sender as EAPPasswordBox; 

    if (passwordBox != null) 
    { 
     passwordBox.SetVisibilityOfTextBoxes(); 
    } 
} 
 

Hope it helps.

+0

Fonctionne très bien merci, maintenant je dois comprendre comment afficher le message d'erreur de validation du modèle de vue parent dans ces zones de texte dans le contrôle de l'utilisateur ... – hoetz

0

Implémentez ce que vous faites dans le setter de la propriété dans le gestionnaire OnShowTextPropertyChanged. Le setter ne sera utilisé que pour initialiser la liaison.

Questions connexes