如何根据验证启用/禁用对话框的按钮
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");
}
}
您可以使用 Style
和 DataTrigger
绑定到 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
属性.
验证部分 `
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");
}
}
您可以使用 Style
和 DataTrigger
绑定到 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
属性.