Использование MultiBinding для привязки элементов
-
19-09-2019 - |
Вопрос
У меня есть форма входа, содержащая текстовое поле имени пользователя и поле пароля.
Я хочу, чтобы кнопка «ОК» была включена только тогда, когда оба поля содержат значение.
У меня есть конвертер, который проверяет все строки, являются ли они нулевыми или пустыми.
Я поместил точку останова в первую строку метода 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
.Это приведет к тому, что свойство будет обновляться по мере ввода.Однако не уверен, что это будет работать с вашим конвертером.