Frage

Ich habe ein Login-Formular, das einen Benutzernamen und ein Passwort Textbox Feld enthält.

Ich möchte, dass die OK-Taste nur dann aktiviert werden, wenn beide Felder einen Wert enthalten.

Ich habe einen Konverter, der für alle Strings prüfen, ob sie null oder leer sind.

legte ich einen Haltepunkt in der ersten Zeile der Convert-Methode, und er stoppt nur, wenn die MenuItem initialisiert, anschliessend, das heißt, wenn ich den Text ändern, es funktioniert nicht.

Das folgende Beispiel funktioniert gut, das Problem ist, dass die mehrbindigen nicht ausgelöst werden, wenn ich den Text zu ändern; es ist nur gebunden, wenn die Initialisierung der Form:

<!--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>

Ich denke, das Problem ist, dass Sie nicht benachrichtigt werden, wenn Sie die Remote-Bindung Quelle geändert wird (zum Beispiel gibt es keine Option setzen UpdateTargetTrigger="PropertyChanged".

Irgendwelche Ideen?

War es hilfreich?

Lösung

Ich würde vorschlagen, Sie suchen in Befehlsbindung. Ein Befehl kann Ihren Login-Button automatisch in Abhängigkeit von einer Bedingung aktiviert oder deaktiviert wird (dh. Benutzername und das Kennwort nicht leer ist).

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 Befehlsbindung wird wie folgt aussehen

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

Um den Befehl in XAML registrieren

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

oder im Code hinter

public LoginWindow()
{
    InitializeComponent();

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

Weitere readigin hier .

Andere Tipps

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

Versuchen Sie, die UpdateSourceTrigger Einstellung PropertyChanged und die Mode TwoWay. Dadurch wird die Eigenschaft aktualisiert werden während der Eingabe. Nicht sicher, ob dies mit Ihrem Konverter arbeitet, though.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top