WPF multibinding button.isEnabled with textboxes

Mar*_*cin 6 c# wpf textbox button multibinding

我是WPF的新手,我无法在网上找到解决方案.我的问题是,我希望只有当四个文本框没有有效性错误时才启用我的按钮.我的代码是:

<Button Content="Action" Click="Action_Click" >
      <Button.IsEnabled>
          <MultiBinding Converter="{StaticResource ValCon}">
               <Binding ElementName="textBox1" />
               <Binding ElementName="textBox2"/>
               <Binding ElementName="textBox3"/>
               <Binding ElementName="textBox4"/>
          </MultiBinding>
       </Button.IsEnabled>
</Button>
Run Code Online (Sandbox Code Playgroud)

我的多值转换器就像:

class ValidityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool b = true;
        foreach (var x in values)
        {
            TextBox y = x as TextBox;
            if (Validation.GetHasError(y))
            {
                b = false;
                break;
            }
        }
        return b;
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

我注意到这只在一开始就有效.当用户修改其中一个文本框时,它不会.我的值转换器是否需要实现INotifyPropertyChange?在WPF中做这样的事情的正确解决方案是什么?谢谢你的帮助.

编辑

我已经完成了类似的工作并且它正在工作:

                       <Button Click="Button_Click"  >
                            <Button.Style>
                                <Style TargetType="Button">
                                    <Setter Property="IsEnabled" Value="False"/>
                                    <Style.Triggers>
                                        <MultiDataTrigger>
                                            <MultiDataTrigger.Conditions>
                                                <Condition Binding="{Binding Path=(Validation.HasError), ElementName=textBox}" Value="False"/>
                                                <Condition Binding="{Binding Path=(Validation.HasError), ElementName=textBox1}" Value="False"/>
                                                <Condition Binding="{Binding Path=(Validation.HasError), ElementName=textBox2}" Value="False"/>
                                                <Condition Binding="{Binding Path=(Validation.HasError), ElementName=textBox3}" Value="False"/>
                                            </MultiDataTrigger.Conditions>
                                            <Setter Property="IsEnabled" Value="True"/>
                                        </MultiDataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Button.Style>
                        </Button>
Run Code Online (Sandbox Code Playgroud)

raj*_*net 2

我不会实现 IMultiValueConverter,因为我们在这里不转换任何内容。BindingGroup 可以满足您的目的。

使用 MVVM/INotifyPropertyChanged 的​​同样有效的方法如下:-

  1. 将按钮的 IsEnabled 属性绑定到布尔属性(例如 IsValid)。
  2. 将所有文本框绑定到不同的属性。
  3. 任何这些文本框的 OnPropertyChange,调用一个通用函数(例如 Validate())
  4. IsValid 可以根据 Validate() 设置为 true 或 false,这将依次切换(启用/禁用)按钮的状态。

  • 如果能给出代码示例就更好了。由于我们是 WPF 和 .NET 领域的新手,因此它对我们来说很难理解。 (5认同)