سؤال

لدي نموذج تسجيل الدخول يحتوي على مربع نص اسم المستخدم ومربع كلمة المرور.

أريد تمكين الزر "موافق" فقط عندما تحتوي كل من الحقول على قيمة.

لدي محول تحقق من كل السلاسل إذا كانت خالية أو فارغة.

وضعت نقطة توقف في السطر الأول من طريقة تحويل، وتتوقف فقط عند MenuItem تهيئة، بعد الكلمات، أي عندما أقوم بتغيير النص لا.

المثال التالي يعمل بشكل جيد، المشكلة هي أنه لا يتم تشغيل multibiteding عندما أقوم بتغيير النص؛ إنه ملزم فقط عند تهيئة النموذج:

<!--The following is placed in the OK button-->
<Button.IsEnabled>
    <MultiBinding Converter="{StaticResource TrueForAllConverter}">
        <Binding ElementName="tbUserName" Path="Text"/>
        <Binding ElementName="tbPassword" Path="Password"/>
    </MultiBinding>
</Button.IsEnabled>

أعتقد أن المشكلة هي أنه لا تحصل على إشعار عند تغيير مصدر الربط عن بعد (على سبيل المثال لا يوجد خيار لتعيين UpdateTargetTrigger="PropertyChanged".

أيه أفكار؟

هل كانت مفيدة؟

المحلول

أود أن أقترح عليك النظر في ربط القيادة. يمكن لأحد قيادة أو تعطيل زر تسجيل الدخول تلقائيا اعتمادا على بعض الشرط (أي اسم المستخدم وكلمة المرور غير فارغ).

public static RoutedCommand LoginCommand = new RoutedCommand();

private void CanLoginExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = !string.IsNullOrEmpty(_userInfo.UserName) && !string.IsNullOrEmpty(_userInfo.Password);
    e.Handled = true;
}

private void LoginExecute(object sender, ExecutedRoutedEventArgs e)
{
    MessageBox.Show("Loging in...");
    // Do you login here.
    e.Handled = true;
}

سوف يربط أمر XAML شيء مثل هذا

<TextBox Text="{Binding UserName, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}" />
<Button Command="local:LoginWindow.LoginCommand" >Login</Button>

لتسجيل الأمر في XAML

<Window.CommandBindings>
    <CommandBinding Command="local:LoginWindow.LoginCommand" CanExecute="CanLoginExecute" Executed="LoginExecute" />
</Window.CommandBindings>

أو في الكود وراء

public LoginWindow()
{
    InitializeComponent();

    CommandBinding cb = new CommandBinding(LoginCommand, CanLoginExecute, LoginExecute);
    this.CommandBindings.Add(cb);
}

المزيد من القراءة هنا.

نصائح أخرى

Private Sub tb_Changed(sender As Object, e As RoutedEventArgs) _
        Handles tbUsername.TextChanged, _
                tbPassword.PasswordChanged
    btnOk.IsEnabled = tbUsername.Text.Length > 0 _
              AndAlso tbPassword.Password.Length > 0
End Sub

حاول تحديد UpdateSourceTrigger ل PropertyChanged و ال Mode ل TwoWay. وبعد سيؤدي ذلك إلى تحديث هذه الخاصية أثناء الكتابة. لست متأكدا مما إذا كان هذا سيعمل مع محولك، على الرغم من ذلك.

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