WPF PasswordBox验证无法正常工作

时间:2015-01-30 15:16:18

标签: c# wpf

我有一个密码箱实现为自定义控件,如下所示。我很难添加验证,需要检查密码是否为空。如果是,那么我需要显示一条消息,说明“请输入密码”

   <UserControl x:Class="Controls.MyPasswordBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d">
        <UserControl.Resources>

    </UserControl.Resources>
    <PasswordBox Name="MyPasswordBoxControl" 
                 DataContext="{Binding Path=MyPasswordBoxControl, Mode=TwoWay}"></PasswordBox>

我的代码如下:

using System.Windows;
using System.Windows.Controls;

namespace Client.Controls
{

    public partial class MyPasswordBox : UserControl
    {
        public MyPasswordBox()
        {
            InitializeComponent();

            MyPasswordBoxControl.PasswordChanged += delegate
            {
                Value = MyPasswordBoxControl.Password;
            };

            if (!MyPasswordBoxControl.IsLoaded)
            {
                MyPasswordBoxControl.Loaded += delegate
                {
                    MyPasswordBoxControl.Password = Value;
                };
            }
        }

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

        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(string), typeof(MyPasswordBox), new PropertyMetadata(""));
    }
}

如何添加验证,检查密码框是否为空?

提前致谢

2 个答案:

答案 0 :(得分:0)

除非您向MyPasswordBox添加更多功能,否则您可以直接使用PasswordBox,然后将您的验证添加到按钮点击处理程序或任何最适合您的应用程序的事件。

例如,在xaml中:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>

    <PasswordBox Grid.Row="0" Name="MyPasswordBox" ></PasswordBox>
    <Button Grid.Row="1" Name="OkButton" Click="OkButton_Click">OK</Button>        
</Grid>

然后,在后面的代码中:

private void OkButton_Click(object sender, RoutedEventArgs e)
    {
        if (MyPasswordBox.Password == String.Empty)
        {
            MessageBox.Show("Please enter a password");
        }
    }

要在密码框为空时显示工具提示,您可以使用xaml执行此类操作:

<PasswordBox Grid.Row="0" Name="MyPasswordBox" ToolTip="Please enter a password"  PasswordChanged="MyPasswordBox_PasswordChanged"></PasswordBox>

然后在后面的代码中:

private void MyPasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
    {
        ToolTipService.SetIsEnabled(MyPasswordBox, MyPasswordBox.Password == String.Empty);
    }

要让错误显示在PasswordBox的右侧,您可以执行以下操作:

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>

        <PasswordBox Grid.Row="0" Name="MyPasswordBox" Margin="5" PasswordChanged="MyPasswordBox_PasswordChanged"></PasswordBox>
        <Label Grid.Row="0" Grid.Column="1" Name="EnterPasswordLabel">Please enter a password</Label>
        <Button Grid.Row="1" Grid.ColumnSpan="2" Name="OkButton" Click="OkButton_Click">OK</Button>

    </Grid>

然后在后面的代码中:

private void MyPasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
    {
        EnterPasswordLabel.Visibility = MyPasswordBox.Password == String.Empty ? Visibility.Visible : Visibility.Collapsed;  
    }

答案 1 :(得分:0)

查看IDataErrorInfo。 More info here