2013-02-27 20 views
11

को सत्यापित करने के लिए कैसे मैं PasswordBox के लिए सत्यापन करने का प्रयास कर रहा हूं। सत्यापन करने के लिए मैंने link का पालन किया, जो दिखाता है कि TextBox पर कैसे सत्यापित किया जाए।पासवर्डबॉक्स WPF

समस्या PasswordBoxes के साथ आता है। चूंकि सुरक्षा कारणों से Password बाध्यकारी नहीं है, इसलिए मैंने कोडप्रोजेक्ट उपयोगकर्ताओं के लिए this link (here समझाया) के बाद बाध्यकारी बनाने की कोशिश की।

तो जाहिर है, शानदार! मैं अपने PasswordBox को Password संपत्ति के साथ बांध सकता हूं, इसलिए मैं अपनी सत्यापन के साथ बाध्य कर सकता हूं। लेकिन यह मुझे ध्यान नहीं देता ...

यह एक नियमित रूप से TextBox है कि मैं का उपयोग करें और ठीक काम करता है:

<local:ErrorProvider Grid.Column="1" Grid.Row="2" > 
    <TextBox Width="160" 
      HorizontalAlignment="Left" 
      Name="textBoxUserPass" 
      Text="{Binding Path=Password, UpdateSourceTrigger=Explicit}" /> 
</local:ErrorProvider> 

और यह PasswordBox मैं अनुकरण करने की कोशिश की है:

<local:ErrorProvider Grid.Column="1" Grid.Row="2" > 
     <PasswordBox Width="160" 
      HorizontalAlignment="Left" 
      Name="textBoxUserPass" 
      local:PasswordBoxAssistant.BindPassword="True" 
      local:PasswordBoxAssistant.BoundPassword="{Binding Path=Password, UpdateSourceTrigger=Explicit}" /> 
</local:ErrorProvider> 

यह कैसे है मुझे प्रत्येक TextBox:

BindingExpression beUserName = textBoxUserName.GetBindingExpression(TextBox.TextProperty); 
if (beUserName != null) beUserName.UpdateSource(); 
के लिए BindingExpression मिलता है 210

और यह मैं इसे कैसे PasswordBox के लिए मिलता है:

BindingExpression bePassword = textBoxUserPass.GetBindingExpression(PasswordBoxAssistant.BoundPassword); 
if (bePassword != null) bePassword.UpdateSource(); 

अगर हम किसी भी गलती की है (मेरी मान्यता वर्ग पर परिभाषित), जब मैं ऐसा करते हैं:

if (!beUserName.HasError && !bePassword.HasError) 

प्रत्येक BindingExpressionकहना चाहिए त्रुटि सत्यापन के आधार परझूठी। लेकिन मेरे PasswordBox के लिए कभी भी मूल्य नहीं मिलता ... कोई विचार?

+0

आप स्थापित करने की कोशिश की है ' ValidatesOnDataErrors = True' और 'ValidatesOnExceptions = True' आपके बाइंडिंग पर? –

+0

यह 'पासवर्डबॉक्स' के लिए मौजूद नहीं है ... – Sonhja

+0

यह 'बाउंडपास्वर्ड 'संलग्न संपत्ति के लिए करता है:' स्थानीय: पासवर्डबॉक्सएसिस्टेंट.बाउंडपास्वर्ड = "{बाइंडिंग पथ = पासवर्ड, अपडेटसोर्स ट्रिगर = स्पष्टीकरण, मान्यताऑनडेटाइरर्स = ट्रू, वैलिडेट्सऑनएक्सप्शन = ट्रू} "' –

उत्तर

11

अपने बंधन पर ValidatesOnDataErrors=True और ValidatesOnExceptions=True सेट करके देखें:, अपने बंधन

local:PasswordBoxAssistant.BoundPassword="{Binding Path=Password,Mode=TwoWay, 
UpdateSourceTrigger=Explicit}" 
1

जहां तक ​​मुझे याद है, पासवर्डबॉक्स पर सत्यापन जोड़ने का एकमात्र तरीका सिक्योरपासवर्ड के लिए बाध्यकारी संपत्ति के सेटटर में एक नया प्रमाणीकरण अपवाद फेंकना है। PasswordBoxAssistant इससे आपकी सहायता नहीं करेगा।

+0

हमम आप एक उदाहरण या लिंक प्रदान कर सकते हैं? यह एक समाधान के रूप में लगता है। – Sonhja

+0

यह वही है जो मैंने एक पुराने ऐप में पाया था जिसे मैं काम कर रहा था: सार्वजनिक सिक्योरस्टिंग न्यूपासवर्ड { { वापसी _newPassword; } सेट { _newPassword = value; स्ट्रिंग त्रुटि = IsPasswordValid(); यदि (! String.IsNullOrEmpty (त्रुटि)) { नया सत्यापन निष्पादन (त्रुटि) फेंक दें; } } } –

+0

हमम, इसे आजमाएगा, लेकिन सटीक समाधान एक रिचर्ड डीमिंग पोस्ट किया गया है (इस मामले के लिए)। लेकिन मैं इसे भी कोशिश कर रहा हूं, क्योंकि मेरे पास यह कोड भी मेरे कोड पर है। – Sonhja

1

सेट मोड = TwoWay बीच में किसी भी "असुरक्षित" स्ट्रिंग का उपयोग किए बिना किया जा सके, विंडो कोड को अनुकूलित करें, इस तरह कुछ:

मान लीजिए कि मेरे पास एक एमवीवीएम ऑब्जेक्ट है,का उपयोग करके WPF सत्यापन के साथ 210:

public class MyObject : INotifyPropertyChanged, IDataErrorInfo 
{ 
    ... 
    public SecureString SecurePassword 
    { 
     get 
     { ... } 
     set 
     { 
      ... 
      OnPropertyChanged("SecurePassword"); 
     } 
    } 

    ... 

    string IDataErrorInfo.Error { get { return Validate(null); } } 
    string IDataErrorInfo.this[string columnName] { get { return Validate(columnName); } } 

    private string Validate(string memberName) 
    { 
     string error = null; 
     ... 
     if (memberName == "SecurePassword" || memberName == null) 
     { 
      // this is where I code my custom business rule 
      if (SecurePassword == null || SecurePassword.Length == 0) 
      { 
       error = "Password must be specified."; 
      } 
     } 
     ... 
     return error; 
    } 

} 

और इस तरह एक PasswordBox के साथ एक विंडो Xaml:

<PasswordBox Name="MyPassword" PasswordChanged="MyPassword_Changed" ... /> 

फिर, इस तरह इसी खिड़की कोड PasswordBox बाध्यकारी ट्रिगर किया जाएगा:

// add a custom DependencyProperty 
public static readonly DependencyProperty SecurePasswordProperty = 
    DependencyProperty.RegisterAttached("SecurePassword", typeof(SecureString), typeof(MyWindow)); 

public MyWindow() 
{ 
    InitializeComponent(); 

    DataContext = myObject; // created somewhere 

    // create a binding by code 
    Binding passwordBinding = new Binding(SecurePasswordProperty.Name); 
    passwordBinding.Source = myObject; 
    passwordBinding.ValidatesOnDataErrors = true; 
    // you can configure other binding stuff here 
    MyPassword.SetBinding(SecurePasswordProperty, passwordBinding); 
} 

private void MyPassword_Changed(object sender, RoutedEventArgs e) 
{ 
    // this should trigger binding and therefore validation 
    ((MyObject)DataContext).SecurePassword = MyPassword.SecurePassword; 
} 
2

एक अन्य समाधान पर

<PasswordBox ... 
    local:PasswordBoxAssistant.BoundPassword="{Binding Path=Password, 
     UpdateSourceTrigger=Explicit, 
     ValidatesOnDataErrors=True, 
     ValidatesOnExceptions=True}" 
/>