Вопрос

У меня есть форма входа, содержащая текстовое поле имени пользователя и поле пароля.

Я хочу, чтобы кнопка «ОК» была включена только тогда, когда оба поля содержат значение.

У меня есть конвертер, который проверяет все строки, являются ли они нулевыми или пустыми.

Я поместил точку останова в первую строку метода Convert, и он останавливается только тогда, когда MenuItem инициализирует, послесловия, т.е.когда я меняю текст, этого не происходит.

Следующий пример работает хорошо, проблема в том, что мультипривязка не запускается, когда я меняю текст;он привязан только при инициализации формы:

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

Я думаю, проблема в том, что вы не получаете уведомления об изменении источника удаленной привязки (например,нет возможности установить UpdateTargetTrigger="PropertyChanged".

Есть идеи?

Это было полезно?

Решение

Я бы посоветовал вам изучить привязку команд.Команда может автоматически включать или отключать кнопку входа в систему в зависимости от некоторых условий (т.имя пользователя и пароль не пустые).

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 будет выглядеть примерно так

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

Чтобы зарегистрировать команду в XAML

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

Или в коде позади

public LoginWindow()
{
    InitializeComponent();

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

Больше чтения здесь.

Другие советы

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

Попробуйте установить UpdateSourceTrigger к PropertyChanged и Mode к TwoWay.Это приведет к тому, что свойство будет обновляться по мере ввода.Однако не уверен, что это будет работать с вашим конвертером.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top