1

我想让一个按钮的 IsEnabled 仅在两个文本框没有任何错误时才为真(在这种情况下,我只希望它们都是数字)

我尝试将文本框设置为 NotifyOnValidationError=True,认为这会引发一个异常,该异常会冒泡到容器控件 - 然后我会根据属于该控件的 Validation.HasError 附加属性将按钮的 IsEnabled 设置为 true

我尝试了以下(去除了格式化代码),但它不起作用(当我第一次启动应用程序并且文本框为空时启用了按钮 -​​ 它们绑定到可为空的小数)

<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>
4

2 回答 2

3

您可以使用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>

然后你只需要通过实现IMultiValueConverter来创建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();
    }
}
于 2012-08-22T04:33:34.177 回答
1

您还可以按照此MSDN 文章中的说明创建 CommandBinding ,然后使用 CanExecuteHandler 通过设置CanExecute来启用/禁用按钮。

从第二个链接:

通常,诸如 MenuItem 之类的命令源将调用 RoutedCommand 上的 CanExecute 方法,以确定该命令是否可以在当前命令目标上执行。如果从事件处理程序中将 CanExecute 设置为 false,则命令源将自行禁用。例如,如果 MenuItem 充当命令的命令源,并且该命令无法在当前命令目标上执行,则 MenuItem 将自身变灰。

于 2012-08-22T04:45:18.873 回答