我有一个包含用户名文本框和密码框的登录表单。
我希望仅当两个字段都包含值时才启用ok按钮。
我有一个转换器,检查所有字符串是否为空或空。
我在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"
的选项。
有什么想法吗?
答案 0 :(得分:2)
我建议你看一下命令绑定。命令可以根据某些条件自动启用或禁用“登录”按钮(即用户名和密码不为空)。
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);
}
更多readigin here。
答案 1 :(得分:0)
尝试将UpdateSourceTrigger
设置为PropertyChanged
,将Mode
设置为TwoWay
。这将导致在您键入时更新属性。但不确定这是否适用于您的转换器。
答案 2 :(得分:0)
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