我想让一个按钮的IsEnabled只有两个文本框没有任何错误才会成立(在这种情况下,我只想让它们都是数字)
我尝试将文本框设置为NotifyOnValidationError = True,认为这会引发一个异常,它会冒泡到容器控件 - 我会根据属于该控件的Validation.HasError附加属性将Button的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>
答案 0 :(得分: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();
}
}
答案 1 :(得分:1)
您也可以按照此MSDN article中的说明创建CommandBinding,然后使用CanExecuteHandler通过设置CanExecute启用/禁用按钮。
来自第二个链接:
通常,命令源(如MenuItem)将在RoutedCommand上调用CanExecute方法,以确定该命令是否可以在当前命令目标上执行。如果从事件处理程序将CanExecute设置为false,则命令源将自行禁用。例如,如果MenuItem充当命令的命令源,并且该命令无法在当前命令目标上执行,则MenuItem将自行灰显。