Свойство Silverlight 4 Usercontrol не может получить PropertyChanged от родительского элемента управления - PullRequest
0 голосов
/ 03 марта 2011

Я установил простой элемент управления Silverlight 4, который должен переключать видимость двух текстовых полей на основе открытого свойства.Я добавляю элемент управления к представлению и устанавливаю привязку данных свойства элемента управления к свойству модели представления родительского представления.Когда происходит изменение в свойстве родительской viewmodel, в usercontrol ничего не происходит.Хотя он и связан, OnPropertyChanged, похоже, не интересует свойство привязки пользовательского элемента управления.Ниже приведен код пользовательского элемента управления.

<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));
        }
    }

}

Вот как я использую его в родительском представлении:

<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");
        }
    }

Когда "showPassword "в view-модели родительского представления изменяется, в пользовательском элементе управления ничего не происходит, и это сводит меня с ума :) Есть идеи?Спасибо.

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Обновления связанных свойств зависимости не происходят с обычными средствами доступа get / set свойства, а скрываются. Таким образом, единственный способ перехвата при изменении значения заключается в предоставлении DependencyPropertyChangedEventHandler в PropertyMetadata при создании свойства зависимости.

следующим образом:


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();
    }
}

Надеюсь, это поможет.

0 голосов
/ 03 марта 2011

Реализуйте то, что вы делаете, в установщике свойства в обработчике OnShowTextPropertyChanged. Сеттер будет использоваться только для инициализации привязки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...