WP7 Custom Control Binding Внутренний контроль - PullRequest
0 голосов
/ 26 июля 2011

Я создаю пользовательский элемент управления с PasswordBox.Как подключить DependencyProperty моего пользовательского элемента управления к свойству Password PasswordBox?

Из всех примеров, которые я вижу, подключив его в шаблоне с помощью TemplateBindingдолжен сделать трюк, но это не похоже на работу.Чего мне не хватает?

generic.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:CustomControlBinding="clr-namespace:CustomControlBinding">

    <Style TargetType="CustomControlBinding:PasswordBoxTest">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="CustomControlBinding:PasswordBoxTest">
                    <Grid Background="Transparent">
                        <PasswordBox Password="{TemplateBinding Text}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>

PasswordBoxTest.cs

namespace CustomControlBinding
{
    public class PasswordBoxTest : Control
    {
        public static readonly DependencyProperty TextProperty = DependencyProperty.Register( "Text", typeof( string ), typeof( PasswordBoxTest ), new PropertyMetadata( OnTextPropertyChanged ) );

        public string Text
        {
            get { return GetValue( TextProperty ) as string; }
            set { SetValue( TextProperty, value ); }
        }

        public PasswordBoxTest()
        {
            DefaultStyleKey = typeof( PasswordBoxTest );
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
        }

        private static void OnTextPropertyChanged( DependencyObject sender, DependencyPropertyChangedEventArgs e )
        {
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 26 июля 2011

TemplateBinding в порядке. Вам нужно как-то установить источник привязки (например, через упомянутый DataContext или просто в Xaml, используя атрибут Text), но я не могу судить, в чем проблема, поскольку вы пропустили этот код.

Я не знаю, какова цель этого класса, но, возможно, добавление некоторых функций в стандартный PasswordBox. Я хотел бы сохранить обе реализации как можно более похожими. Что я имею в виду свойство Text должно называться Password и т. Д.

Еще одно замечание: представленный шаблон не нуждается в сетке. Если у вас нет дополнительных причин для его использования, удалите его - это просто добавляет сложности макета. Обратите внимание, что шаблон по умолчанию для PasswordBox уже обернут в идентичной сетке ...

0 голосов
/ 26 сентября 2011

Я не смог заставить это работать, независимо от того, что я делаю. Вместо этого я работал над настройкой некоторой фальшивой привязки в коде.

namespace CustomControlBinding
{
    public class PasswordBoxTest : Control
    {
        private PasswordBox passwordBox;
        private string passwordSetBeforeTemplateApplied;

        public static readonly DependencyProperty PasswordProperty = DependencyProperty.Register( "Password", typeof( string ), new PropertyMetadata( OnPasswordPropertyChanged ) );

        public string Password
        {
            get { return GetValue( PasswordProperty ) as string; }
            set { SetValue( PasswordProperty, value ); }
        }

        public PasswordBoxTest()
        {
            DefaultStyleKey = typeof( PasswordBoxTest );
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            passwordBox = (PasswordBox)GetTemplateChild( "PasswordElement" );
            passwordBox.PasswordChanged += PasswordBoxPasswordChanged;
            if( !string.IsNullOrEmpty( passwordSetBeforeTemplateApplied ) )
            {
                passwordBox.Password = passwordSetBeforeTemplateApplied;
            }
        }

        public static void OnPasswordPropertyChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
        {
            ( (WatermarkPasswordBox)d ).OnPasswordChanged( d, e );
        }

        private void OnPasswordChanged(  DependencyObject d, DependencyPropertyChangedEventArgs e )
        {
            if( passwordBox == null )
            {
                passwordSetBeforeTemplateApplied = Password;
                return;
            }

            if( Password != passwordBox.Password )
            {
                passwordBox.Password = Password;
            }
        }

        private void PasswordBoxPasswordChanged( object sender, RoutedEventArgs e )
        {
            if( passwordBox.Password != Password )
            {
                Password = passwordBox.Password;
            }
        }    
    }
}
0 голосов
/ 26 июля 2011

Вы должны использовать RelativeSource bindings , чтобы он работал.Или вы должны установить DataContext вашего UserControl на this.

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