Utilizzando MultiBinding per associare gli elementi
-
19-09-2019 - |
Domanda
Ho una forma di accesso che contiene una casella di testo nome utente e una scatola password.
Voglio il tasto OK per essere attivato solo quando entrambi i campi contengono un valore.
Ho un convertitore che verificare la presenza di tutte le corde se sono nulli o vuoti.
ho messo un punto di interruzione nella prima riga del metodo Convert, e si ferma solo quando il MenuItem
inizializza, afterwords, cioè quando cambio il testo non lo fa.
Il seguente esempio funziona bene, il problema è che il MultiBinding non viene attivato quando cambio il testo; è destinato solo quando l'inizializzazione del modulo:
<!--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>
Credo che il problema è che non si ottiene una notifica quando la sorgente remota di legame viene modificata (ad esempio non c'è un opzione per impostare UpdateTargetTrigger="PropertyChanged"
.
Tutte le idee?
Soluzione
Vorrei suggerire di guardare in comando vincolante. Un comando può attivare o disattivare automaticamente il pulsante Login base a una certa condizione (es. Nome utente e la password non è vuoto).
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;
}
comando XAML vincolante avrà un aspetto simile a questo
<TextBox Text="{Binding UserName, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}" />
<Button Command="local:LoginWindow.LoginCommand" >Login</Button>
Per registrare il comando in XAML
<Window.CommandBindings>
<CommandBinding Command="local:LoginWindow.LoginCommand" CanExecute="CanLoginExecute" Executed="LoginExecute" />
</Window.CommandBindings>
O in codice dietro
public LoginWindow()
{
InitializeComponent();
CommandBinding cb = new CommandBinding(LoginCommand, CanLoginExecute, LoginExecute);
this.CommandBindings.Add(cb);
}
qui .
Altri suggerimenti
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
Provare a impostare la UpdateSourceTrigger
al PropertyChanged
e il Mode
a TwoWay
. Questo farà sì che la proprietà di essere aggiornato durante la digitazione. Non sono sicuro se questo funzionerà con il convertitore, però.