2009-05-20 10 views
10

मैं बस एम-वी-वीएम और डब्ल्यूपीएफ के साथ शुरू कर रहा हूं और कुछ बाध्यकारी मुद्दों को समझने में समस्याएं हैं।पासवर्डबॉक्स बाध्यकारी

मेरे पास एक लॉगिन पृष्ठ है जिसमें ComboBox और PasswordBox है। ComboBox इस तरह दिखता है:

<ComboBox Name="comboBox1" SelectedItem="{Binding Path=Username}"> 

यह सिर्फ ठीक काम करता है - मेरे मान अपडेट कर दिया ComboBox पर हर SelectedItem परिवर्तन!

public bool CanLogin() 
{ 
    return !string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password); 
} 

तो मेरी समस्या मैं PasswordBox ViewModel पर पासवर्ड संपत्ति के लिए बाध्य नहीं है:

मेरी ViewModel में मैं अगर लॉग इन बटन सक्रिय है एक ICommand जो इस विधि का उपयोग करता निर्धारित करने के लिए है - इसलिए मुझे यह अपडेट करने का कोई तरीका नहीं है कि इसे कब अपडेट किया जाए।

तो मैं अपने व्यूमोडेल में PasswordBox का मूल्य कैसे प्राप्त करूं? मैंने जो कुछ भी पढ़ा है, वह सुरक्षा कारणों से PasswordBox को बाध्य नहीं करता है। मैं केवल CanLogin() पर पासवर्ड प्रतिबंध हटा दूंगा लेकिन मुझे खाता सेवा के साथ पास करने के लिए मूल्य की आवश्यकता है।

+0

यदि आप पासवर्ड को स्ट्रिंग (और सुरक्षित नहीं) के रूप में बाध्य करते हैं तो आप अपनी प्रक्रिया की स्मृति में पासवर्ड का पर्दाफाश कर रहे हैं। दोनों दिए गए समाधान सुरक्षा समझौता – Rubinsh

उत्तर

27

दिलचस्प।

इस ब्लॉग पोस्ट को देखें और देखें कि यह आपकी मदद कर रहा है या नहीं। http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html

जाहिर लिंक मृत अभी यहाँ है मूल समाधान (here पाया जाता है) है:

आप संलग्न गुणों का उपयोग इस तरह एक सहायक बनाने के लिए कर सकते हैं:

 
public static class PasswordHelper 
{ 
    public static readonly DependencyProperty PasswordProperty = 
     DependencyProperty.RegisterAttached("Password", 
     typeof(string), typeof(PasswordHelper), 
     new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged)); 

    public static readonly DependencyProperty AttachProperty = 
     DependencyProperty.RegisterAttached("Attach", 
     typeof(bool), typeof(PasswordHelper), new PropertyMetadata(false, Attach)); 

    private static readonly DependencyProperty IsUpdatingProperty = 
     DependencyProperty.RegisterAttached("IsUpdating", typeof(bool), 
     typeof(PasswordHelper)); 


    public static void SetAttach(DependencyObject dp, bool value) 
    { 
     dp.SetValue(AttachProperty, value); 
    } 

    public static bool GetAttach(DependencyObject dp) 
    { 
     return (bool)dp.GetValue(AttachProperty); 
    } 

    public static string GetPassword(DependencyObject dp) 
    { 
     return (string)dp.GetValue(PasswordProperty); 
    } 

    public static void SetPassword(DependencyObject dp, string value) 
    { 
     dp.SetValue(PasswordProperty, value); 
    } 

    private static bool GetIsUpdating(DependencyObject dp) 
    { 
     return (bool)dp.GetValue(IsUpdatingProperty); 
    } 

    private static void SetIsUpdating(DependencyObject dp, bool value) 
    { 
     dp.SetValue(IsUpdatingProperty, value); 
    } 

    private static void OnPasswordPropertyChanged(DependencyObject sender, 
     DependencyPropertyChangedEventArgs e) 
    { 
     PasswordBox passwordBox = sender as PasswordBox; 
     passwordBox.PasswordChanged -= PasswordChanged; 

     if (!(bool)GetIsUpdating(passwordBox)) 
     { 
      passwordBox.Password = (string)e.NewValue; 
     } 
     passwordBox.PasswordChanged += PasswordChanged; 
    } 

    private static void Attach(DependencyObject sender, 
     DependencyPropertyChangedEventArgs e) 
    { 
     PasswordBox passwordBox = sender as PasswordBox; 

     if (passwordBox == null) 
      return; 

     if ((bool)e.OldValue) 
     { 
      passwordBox.PasswordChanged -= PasswordChanged; 
     } 

     if ((bool)e.NewValue) 
     { 
      passwordBox.PasswordChanged += PasswordChanged; 
     } 
    } 

    private static void PasswordChanged(object sender, RoutedEventArgs e) 
    { 
     PasswordBox passwordBox = sender as PasswordBox; 
     SetIsUpdating(passwordBox, true); 
     SetPassword(passwordBox, passwordBox.Password); 
     SetIsUpdating(passwordBox, false); 
    } 
} 

यह प्रयोग करें:

<PasswordBox w:PasswordHelper.Attach="True" 
      w:PasswordHelper.Password="{Binding Text, ElementName=plain, Mode=TwoWay}" 
      Width="100"/> 
+0

मुझे पता है कि यह वास्तव में पुराना उत्तर है और काम करता है, लेकिन क्या किसी ने देखा कि कोड कितना निराला है? शायद मुझे इसका एक जटिल संस्करण पोस्ट करना चाहिए? –

+1

उपरोक्त कोड काम नहीं करता है (पासवर्डहेल्पर), इसके बजाय लिंक में विधि का उपयोग करें (पासवर्डबॉक्सएसिस्टेंट)। http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html – morph85

8

मैंने एक GIST here पोस्ट किया है जो एक बाध्यकारी पासवर्ड बॉक्स है।

+1

अच्छा समाधान। एम्बेड किए गए पासवर्डबॉक्स के गुणों को आसानी से कैसे बढ़ाया जाए (उदाहरण के लिए अग्रभूमि, पृष्ठभूमि) ताकि उन्हें XAML में एक्सेस किया जा सके? –

संबंधित मुद्दे