使用MultiBinding绑定元素

时间:2009-09-30 04:26:48

标签: wpf xaml triggers multibinding updatesourcetrigger

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

我希望仅当两个字段都包含值时才启用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"的选项。

有什么想法吗?

3 个答案:

答案 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