ملزمة passwordbox
-
23-08-2019 - |
سؤال
أنا فقط بدأت مع MV-VM و WPF ووجود مشكلات فهم بعض المشكلات الملزمة.
لدي صفحة تسجيل الدخول التي لديها ComboBox
و PasswordBox
. وبعد ال ComboBox
يشبه هذا:
<ComboBox Name="comboBox1" SelectedItem="{Binding Path=Username}">
هذا يعمل بشكل جيد فقط - تحصل قيمي في كل مرة SelectedItem
التغييرات في ComboBox
!
في رأيي لدي ICommand
الذي يستخدم هذه الطريقة لتحديد ما إذا كان زر تسجيل الدخول نشط:
public bool CanLogin()
{
return !string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password);
}
لذلك مشكلتي ليست لدي PasswordBox
ملزمة إلى خاصية كلمة المرور على ViewModel - لذلك ليس لدي طريقة لمعرفة متى يتم تحديثها.
فكيف يمكنني الحصول على قيمة PasswordBox
إلى رأيي؟ كل ما قرأته يقول فقط لا ترتبط PasswordBox
لأسباب أمنية. أنا ببساطة خلع تقييد كلمة المرور على canlogin () ولكني أحتاج إلى القيمة لتمريرها إلى حساب على حساب.
المحلول
مثير للانتباه.
انظر إلى هذه المدونة وظيفة ومعرفة ما إذا كانت تساعدك.http://blog.functionalfun.net/2008/06/wpf- passwordbordboard-and-data-binding.html.
على ما يبدو الرابط ميت الآن حتى هنا هو الحل الأصلي (وجدت هنا):
يمكنك استخدام الخصائص المرفقة لإنشاء مساعد مثل هذا:
Public Satic Class PasswordHelper {Public Static ReadonlyProperty PasswordProperty = detailcyproperty.registerached ("كلمة المرور"، TypeOF (سلسلة)، TypeOF (PasswordHelper)، FrameworkPropertyMetAdata (String.Ampty، OnPasswordPropertychanged))؛ Public Static ReadonlyProperty AttackProperty = detailcyproperty.registerached ("إرفاق"، TypeOF (Bool)، TypeOF (PasswordHelper)، New PropertyMetAdata (False، ABACK))؛ Private Static ReadonlyProperty isupdatingproperty = detailcyproperty.registerached ("isupdating"، TypeOF (BOOL)، TypeOF (PasswordHelper))؛ Setattach Static Public Setattach (DECENTENSENSONOBJECT DP، قيمة BOOL) {DP.SetValue (Attachproperty، القيمة)؛ } Public Satic Bool GetAttach (DECENTYSENOBJECT DP) {EXTRENT (BOOL) DP.GetValue (AttachProperty)؛ } GetPassword StressPord Stressionword (DECENTYSONOBJECTS DP) {إرجاع (string) dp.getValue (passwordproperty)؛ } SetPassword الفراغ الثابت العام (DECENENSENSONOBJECT DP، قيمة السلسلة) {dp.setvalue (passwordproperty، القيمة)؛ } Private Bool Bool GetIsupdating (dendencyObject DP) {إرجاع (bool) dp.getvalue (isupdatingproperty)؛ } setisupdating الفراغ الثابت الخاص (dendencyObject dp، قيمة bool) {dp.setvalue (isupdatingpropreoperty، القيمة)؛ } Private ثابت VOIT OnPasswordPropertyChanged (DECENTYSENOBJECN PRENERNER، DECENTYCEPROPERTYCHANGEDEVENTARE E) {passwordbox Passwordbox = المرسل كحدث كلمة المرور؛ passwordbox.passwordchanged - = passwordchanged؛ إذا (! (bool) getisupdating (passwordbox) {passwordbox.password = (string) e.newvalue؛ } passwordbox.passwordchanged + = passwordchanged؛ } إرفاق الفراغ الثابت الخاص (المرسل الفضائي، detencypropertychangedeventargs e) {passwordbox passwordbox = المرسل كحدث كلمة المرور؛ إذا (passwordbox == null) العودة؛ إذا ((bool) e.oldvalue) {passwordbox.passwordchanged - = passwordchanged؛ } إذا ((bool) e.newvalue) {passwordbox.passwordchanged + = passwordchanged؛ }} خاص باطلة باطلة باطلة (كائن المرسل، RoutEdeventargs E) {passwordbox passwordbox = المرسل كعلوم مرور؛ setisupdating (passwordbox، صحيح)؛ setpassword (passwordbox، passwordbox.password)؛ setisupdating (passwordbox، خطأ)؛ }}
استخدامها:
<PasswordBox w:PasswordHelper.Attach="True"
w:PasswordHelper.Password="{Binding Text, ElementName=plain, Mode=TwoWay}"
Width="100"/>
نصائح أخرى
لقد نشرت GIST هنا هذا هو مربع كلمة المرور الملزمة.