-->

制作一个按钮的IsEnabled状态取决于两个文本框(Making a Button IsEnabl

2019-10-17 04:22发布

我想有一个按钮的IsEnabled如果两个文本框没有任何错误,只能是真实的(在这种情况下,我只希望他们都为数字)

我试过文本框设置为NotifyOnValidationError =真,以为这将提高该冒泡到容器的控制异常 - 那么我将设置按钮的IsEnabled为真基于属于该控制Validation.HasError附加属性

我尝试以下(剥离的格式代码),但它不工作(当我第一次启动应用程序和文本输入框是空的按钮被激活 - 他们必然可空小数)

<WrapPanel>
    <TextBox x:Name="txtDeltaMin"Text="{Binding Path=DeltaMinFilter, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"></TextBox>
    <TextBox x:Name="txtDeltaMax" Text="{Binding Path=DeltaMaxFilter, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"></TextBox>
    <Button x:Name="btnUpdateFilter" Click="btnUpdateFilter_Click" IsEnabled="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type WrapPanel}}, Path=(Validation.HasError)}">Filter</Button>
</WrapPanel>

Answer 1:

您可以使用MultiBinding 。 应该是这个样子:

<TextBox Text="{Binding Path=DeltaMinFilter, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" />
<TextBox x:Name="txtDeltaMax" Text="{Binding Path=DeltaMaxFilter, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" />
<Button x:Name="btnUpdateFilter" Click="btnUpdateFilter_Click" Content="Filter">
    <Button.IsEnabled>
        <MultiBinding Converter="{StaticResource IsEnabledConverter}">
            <Binding ElementName="txtDeltaMin" Path="Validation.HasError" />
            <Binding ElementName="txtDeltaMax" Path="Validation.HasError" />
        </MultiBinding>
    </Button.IsEnabled> 
</Button>

然后你只需要通过实施IMul​​tiValueConverter使IsEnabledConverter类,并将其添加为一个资源。

public class IsEnabledConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        foreach (var isValid in values)
            if (isValid as bool? == false) 
                return false;
        return true;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}


Answer 2:

你也可以创建一个如的CommandBinding这说明MSDN文章 ,然后使用CanExecuteHandler启用/通过设置禁用按钮CanExecute 。

从第二个环节:

典型地,命令源,例如一个菜单项,将调用一个该的RoutedCommand方法CanExecute以确定是否命令可以或不可以在当前命令目标执行。 如果CanExecute从事件处理程序设置为false,命令源将禁用本身。 例如,如果一个菜单项被用作用于一个命令的命令源和命令不能在当前命令目标执行,那么菜单项将灰本身进行。



文章来源: Making a Button IsEnabled state depend on two textboxes