Pregunta

Tengo un formulario de acceso que contiene un cuadro de texto nombre de usuario y contraseña de una caja.

Quiero el botón Aceptar para estar habilitado sólo cuando tanto los campos contienen un valor.

Tengo un convertidor que comprobar si todas las cuerdas si están nulo o vacío.

coloqué un punto de interrupción en la primera línea del método Convert, y se detiene solo cuando el MenuItem inicializa, epílogos, es decir, cuando cambio el texto no lo hace.

El siguiente ejemplo funciona bien, el problema es que la unión múltiple no se desencadena cuando cambio el texto; que sólo ha obligado al inicializar la forma:

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

Creo que el problema es que no te avisaremos cuando se cambia la fuente de unión a distancia (por ejemplo, no hay una opción para configurar UpdateTargetTrigger="PropertyChanged".

¿Alguna idea?

¿Fue útil?

Solución

Yo sugeriría usted mira en orden vinculante. Un comando puede activar o desactivar el botón Iniciar sesión automáticamente en función de alguna condición (es decir. El nombre de usuario y la contraseña no está vacía).

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 unión se verá algo como esto

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

Para registrar el comando en XAML

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

O en el código detrás

public LoginWindow()
{
    InitializeComponent();

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

aquí .

Otros consejos

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

Trate de establecer la UpdateSourceTrigger a PropertyChanged y la Mode a TwoWay. Esto hará que la propiedad que se actualiza a medida que escribe. No estoy seguro si esto va a funcionar con su convertidor, sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top