2014-04-23 203 views
1

我与MVVM工作,我的舞台是:我有两个PasswordBox验证密码和确认密码为XAML

 <PasswordBox x:Name="Password" Width="150" Height="30" /> 
     <PasswordBox x:Name="PasswordConfirmation" Width="150" Height="30" /> 

我想要做一个验证密码将与PasswordConfirmation之间XAML。就像在网站上做JQuery一样。

我不想破MVVM,我的意思是,我不想让代码落后。

+0

是的你是对的,这是因为安全(忽略绑定)。所以这个博客介绍了一种方法来处理这与附加属性:blog.functionalfun.net/2008/06/... –

+0

和http://stackoverflow.com/a/1493330/440030 –

+0

为什么你删除了你的答案? – CampDev

回答

0

如果您可以容忍IMultiValueConverter的代码,那么下面是非常MVVM。

<Page.Resources> 
    <local:ConfirmPasskey x:Key="ConfirmPasskey" /> 
</Page.Resources> 

...

<PasswordBox x:Name="_PassKey" Grid.Column="1" Grid.Row="1" Margin="0,5,5,0" 
    LostFocus="Update_PassCheckError"/> 
<PasswordBox x:Name="_PassCheck" Grid.Column="1" Grid.Row="2" Margin="0,5,5,0" 
    LostFocus="Update_PassCheckError" /> 
<TextBlock x:Name="_PassCheckError" Grid.ColumnSpan="2" Grid.Row="3" Margin="5,5,5,5" 
    Foreground="Red" HorizontalAlignment="Center" > 
     <TextBlock.Text> 
      <MultiBinding Converter="{StaticResource ConfirmPasskey}" Mode="OneWay" > 
       <Binding ElementName="_PassKey" /> 
       <Binding ElementName="_PassCheck" /> 
      </MultiBinding> 
     </TextBlock.Text> 
</TextBlock> 

我使用一个TextBlock,因为我想provied伪装饰,但可以使用任何相关的财产,...如的IsEnabled财产布尔一个登录提示按钮。这里是我的IMultiValueConverter,它可能会返回一个布尔,而不是密码验证文本:

public class ConfirmPasskey : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parm, System.Globalization.CultureInfo culture) 
    { 
     bool match = (values[0] as PasswordBox).Password.Equals((values[1] as PasswordBox).Password); 

     if (targetType.Name.Equals("Nullable`1")) 
      return match; 

     return (match) ? null : "Passcodes do not match."; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parm, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
}