2

我有一个包含用户名文本框和密码框的登录表单。

我希望仅当两个字段都包含值时才启用确定按钮。

我有一个转换器可以检查所有字符串是否为空或为空。

我在 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".

有任何想法吗?

4

3 回答 3

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

更多阅读在这里

于 2009-10-14T15:41:59.063 回答
0

尝试设置UpdateSourceTriggertoPropertyChangedModeto TwoWay。这将导致在您键入时更新属性。不过,不确定这是否适用于您的转换器。

于 2009-09-30T04:31:32.480 回答
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
于 2009-09-30T16:28:40.277 回答