سؤال

أنا فقط بدأت مع 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 هنا هذا هو مربع كلمة المرور الملزمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top