Pergunta

Eu tenho um formulário de login que contém uma caixa de texto nome de usuário e uma caixa de senha.

Eu quero o botão OK para ser ativado somente quando ambos os campos contêm um valor.

Eu tenho um conversor que verificação para todas as cordas se eles são nulo ou vazio.

Eu coloquei um ponto de interrupção na primeira linha do método Convert, e ele pára apenas quando os inicializa MenuItem, afterwords, isto é, quando eu mudar o texto não.

O exemplo a seguir funciona bem, o problema é que o MultiBinding não é acionado quando eu mudar o texto; ele só é obrigado ao inicializar o formulário:

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

Eu acho que o problema é que você não ser notificado quando a fonte remota ligação é alterado (por exemplo, não existe uma opção para definir UpdateTargetTrigger="PropertyChanged".

Todas as idéias?

Foi útil?

Solução

eu sugiro que você olhar para o comando de ligação. Um comando pode ativar ou desativar o seu botão de login automaticamente, dependendo de alguma condição (ie. Nome de utilizador e palavra-passe não está vazia).

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;
}

ligação de comando XAML será algo parecido com isto

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

Para registrar o comando em XAML

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

Ou no código por trás

public LoginWindow()
{
    InitializeComponent();

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

Mais readigin aqui .

Outras dicas

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

Tente configurar a UpdateSourceTrigger para PropertyChanged eo Mode para TwoWay. Isso fará com que a propriedade a ser atualizado à medida que você digita. Não tenho certeza se isso vai funcionar com o seu conversor, no entanto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top