验证错误时禁用按钮

and*_*eri 18 validation wpf xaml

我有几个带有自定义验证器的文本框:(
我不介意将"错误的"数据发送回对象(属性是字符串),如果出现错误,我只需要阻止按钮的功能,所以如果对于那种验证,绑定不是正确的地方请告诉我.我只是喜欢我可以使用的Validation.ErrorTemplate支持)

<ControlTemplate x:Key="validator" >
    <DockPanel LastChildFill="True">
       <TextBlock DockPanel.Dock="Right" Foreground="Red" FontSize="12pt">!</TextBlock>
       <Border BorderBrush="Red" BorderThickness="1.0">
            <AdornedElementPlaceholder />
       </Border>
    </DockPanel>
</ControlTemplate>

<TextBox Height="23" Width="150"  TextWrapping="Wrap"
         Validation.ErrorTemplate="{StaticResource validator}">
         <TextBox.Text>
            <Binding Path="StringProperty" UpdateSourceTrigger="LostFocus">
               <Binding.ValidationRules>
                   <local:NumbersOnly/>
               </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
</TextBox>
Run Code Online (Sandbox Code Playgroud)

如果出现任何验证错误,如何禁用特定按钮?

<Button Content="DO Work"  Height="57" HorizontalAlignment="Left"  Name="button1" VerticalAlignment="Top" Width="234" Click="button1_Click" />
Run Code Online (Sandbox Code Playgroud)

S.M*_*hra 48

您可以使用MultiDataTrigger财产Style.TriggersButton.我们假设我们有一个TextBox名为"txtName"的名称.我们必须在验证错误上禁用按钮"btnSave" TextBox.

这是你可以做的:

<Button Content="Save" 
        Grid.Column="1"
        Grid.Row="3"
        HorizontalAlignment="Right"
        Height="23" 
        Name="btnSave" 
        Width="75"
        IsDefault="True"
        Command="{Binding SaveProtocolCommand}"
        Margin="3">
  <Button.Style>
    <Style TargetType="Button">
      <Setter Property="IsEnabled" Value="False"/>
      <Style.Triggers>
        <MultiDataTrigger>
          <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding Path=(Validation.HasError), ElementName=txtName}" Value="False"/>
          </MultiDataTrigger.Conditions>
          <Setter Property="IsEnabled" Value="True"/>
        </MultiDataTrigger>
      </Style.Triggers>
    </Style>
  </Button.Style>
</Button>
Run Code Online (Sandbox Code Playgroud)

希望这会帮助你.

  • 如果其他人不知道我没有这样做,你必须在`Validation.HasError`路径周围有括号.[这就是它如何引用附加属性.](http://stackoverflow.com/a/14382796/1229237)没有它们,你会得到一个`System.Windows.Data警告:40:BindingExpression路径错误`就像我一样了. (9认同)
  • @S.Mishra 如果我有两个文本框怎么办?编辑:NVM。只需添加几乎相同的线路条件绑定即可。 (2认同)

小智 5

CanExecuteMVVM中用于授权管理,但人们将其用于验证。最好的方法是在XAML中做到这一点。如果您有多个要验证的字段(这InverseAndBooleansToBooleanConverter是我对多个布尔值的实现),则需要一个转换器。这样做的方法如下:

XAML代码(很抱歉,如果确实显示XAML代码,因为即使尝试也可以显示它):

<Button Name="Button_Test" Content="Test">
    <Button.IsEnabled>
        <MultiBinding Converter="{StaticResource InverseAndBooleansToBooleanConverter}" Mode="TwoWay">
            <Binding ElementName="TextBox_Field1" Path="(Validation.HasError)" />
            <Binding ElementName="TextBox_Field2" Path="(Validation.HasError)" />
            <Binding ElementName="TextBox_Field3" Path="(Validation.HasError)" />
        </MultiBinding>
    </Button.IsEnabled>
</Button>
Run Code Online (Sandbox Code Playgroud)

转换器

public class InverseAndBooleansToBooleanConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values.LongLength > 0)
        {
            foreach (var value in values)
            {
                if (value is bool && (bool)value)
                {
                    return false;
                }
             }
        }    
        return true;
    }

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