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?

È stato utile?

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ò.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top