WPF: подтвержденный пароль - PullRequest
3 голосов
/ 11 мая 2011

У меня есть 2 PasswordBoxes.Мне нужно проверить, равны ли пароли.Я не хочу записывать это условие в код [] .xaml.cs, но я хочу пометить PasswordBox красным, если пароли не совпадают.

Должен ли я написать специальный ValidationRule, какой-нибудь код во ViewModel или что-то еще?Может кто-нибудь мне помочь?Теперь проверка написана в [] .xaml.cs, но я хочу избежать этого.

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Использование:

<PasswordBox Name="tbPassword" />
<PasswordBox Name="tbPasswordConf" />
<PasswordValidator 
      Box1="{Binding ElementName=tbPassword}" 
      Box2="{Binding ElementName=tbPasswordConf}" />

Код (этот код не распространяется на все случаи):

public class PasswordValidator : FrameworkElement
 {
  static IDictionary<PasswordBox, Brush> _passwordBoxes = new Dictionary<PasswordBox, Brush>();

  public static readonly DependencyProperty Box1Property = DependencyProperty.Register("Box1", typeof(PasswordBox), typeof(PasswordValidator), new PropertyMetadata(Box1Changed));
  public static readonly DependencyProperty Box2Property = DependencyProperty.Register("Box2", typeof(PasswordBox), typeof(PasswordValidator), new PropertyMetadata(Box2Changed));

  public PasswordBox Box1
  {
   get { return (PasswordBox)GetValue(Box1Property); }
   set { SetValue(Box1Property, value); }
  }
  public PasswordBox Box2
  {
   get { return (PasswordBox)GetValue(Box2Property); }
   set { SetValue(Box2Property, value); }
  }

  private static void Box1Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
  }
  private static void Box2Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
   var pv = (PasswordValidator)d;
   _passwordBoxes[pv.Box2] = pv.Box2.BorderBrush;
   pv.Box2.LostFocus += (obj, evt) =>
   {
    if (pv.Box1.Password != pv.Box2.Password)
    {
     pv.Box2.BorderBrush = new SolidColorBrush(Colors.Red);
    }
    else
    {
     pv.Box2.BorderBrush = _passwordBoxes[pv.Box2];
    }
   };
  }
 }

Также возможно определить свойство зависимости со стилем ошибки и установить его вместо BorderBrush. Но я не знаю, как использовать в этом случае стандартный ErrorTemplate.

0 голосов
/ 11 мая 2011

Создайте свойство readonly в вашей viewModel и верните кисть для границы PasswordConfirmBox, а затем привяжите текстовое поле к свойству

РЕДАКТИРОВАТЬ после получения комментариев Я не проверял этои могут быть незначительные ошибки, но таким образом вы можете вернуть другой тип в зависимости от параметра преобразователя

 public bool PasswordValidation
    {
        get
        {
            if (textBox1.Text == textBox2.Text)
                return true;
            else
                return
                    false;
        }
    }

Преобразователи значений:

    public class ValConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (parameter == "")
        {
            if ((value as bool?) ?? false)
                return Visibility.Hidden;
            else
                return Visibility.Visible;
        }
        else if (parameter == "")
        {
            if ((value as bool?) ?? false)
                return new SolidColorBrush(Colors.Black);
            else
                return new SolidColorBrush(Colors.Red);
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {

        if (parameter == "Visibility")
        {
            if ((System.Windows.Visibility)value == Visibility.Visible)
                return false;
            else
                return true;
        }
        else if (parameter == "Brush")
        {
            if (((SolidColorBrush)value).Color == Colors.Black)
                return true;
            else
                return false;
        }

    }

Xaml:

<Window.Resources>
    <vis:ValConverter x:Key="valConverter"/>
</Window.Resources>
<TextBox Name="textBox1"/>
<TextBox Name="textBox2" BorderBrush="{Binding ConfirmBorder,Converter={StaticResource valConverter},ConverterParameter=Brush}" />
<TextBlock Text="Passwords Does not Match!" BorderBrush="{Binding ConfirmBorder,Converter={StaticResource valConverter},ConverterParameter=Visibility}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...