如何根据验证启用/禁用对话框的按钮

How to enable/ disable button of a dialog box depending on validation

验证部分 `

Imports System.Globalization
Namespace Validation
Public Class ISBNLength
            Inherits ValidationRule
        Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
        If value.ToString.Trim.Length = 10
                        Return New ValidationResult(True,"")
              Else 
            Return New ValidationResult(False,"Must be a 10 digit number")
        End If              
        End Function
End Class
    End Namespace

**XAML**

<materialDesign:PackIcon Kind="BarcodeScan"
                                 Grid.Row="1" Margin="0,0,16,10" />
        <TextBox x:Name="TxtISBN"
                 Grid.Row="1"
                 materialDesign:HintAssist.Hint="ISBN Number" MaxLength="10" >
            <TextBox.Text>
                <Binding ElementName="TxtISBN" Path="Text" UpdateSourceTrigger="LostFocus">
                    <Binding.ValidationRules>
                        <validation:NotEmpty/>
                        <validation:ISBNLength/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>

        </TextBox>

            <Button
                x:Name="BtnAccept"
                IsDefault="True"
                Command="materialDesign:DialogHost.CloseDialogCommand"
                Content="ADD"
                IsEnabled="False"
                Height="36" Width="90" />

现在我想在函数 returns 为 false 时禁用按钮。

注意:如果不创建对话框的新实例,我将无法访问该对话框。

将 Button`s Enabled 绑定到输入文本并使用值转换器:(没有 VB,抱歉)

public static class Extensions
{
    public static bool IsIsbn(this string s)
    {
        if ((s?.Trim() ?? "") is string isbn)
            return s.Length == 10 /* && whatever */ ;

        return false;
    }
}

public class ValidIsbnToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is string s)
            return s.IsIsbn();

        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        => throw new NotImplementedException();
}

public class ValidationRuleIsbn : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        return ((value as string)?.IsIsbn() ?? false)
            ? ValidationResult.ValidResult
            : new ValidationResult(false, "Must be a 10 digit number");
    }
}

您可以使用 StyleDataTrigger 绑定到 TextBox 的附加 属性:

<Button
    x:Name="BtnAccept"
    IsDefault="True"
    Command="materialDesign:DialogHost.CloseDialogCommand"
    Content="ADD"
    Height="36" Width="90">
    <Button.Style>
        <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=(Validation.HasError), ElementName=TxtISBN}" Value="True">
                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

另请注意 TextBox 应绑定到来源 属性。它无法绑定到自己的 Text 属性.