Verwendung von Multibinding Elemente zu binden,
-
19-09-2019 - |
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?
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.