验证行为未按预期进行
Validation behavior is not doing as expected
情况:
当您点击新产品时,会出现一个弹出屏幕:
如您所见,“Opslagen”按钮被禁用,这很好,因为“Productnaam”是必需的。
现在,如果我开始输入“Opslagen”按钮,那么到目前为止没问题。
但是当我删除 tekst 时,一条红色消息显示该字段是必填字段,但该按钮将不再禁用:
当我再次输入内容时,红色文本再次消失。但是按钮行为没有按预期工作。
XAML :
<TextBox Width="200"
Height="30"
HorizontalAlignment="Left"
VerticalContentAlignment="Center">
<TextBox.Text>
<Binding Path="ProductName" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validators:EmptyValidationRule ValidatesOnTargetUpdated="True" ValidationStep="RawProposedValue" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
<Validation.ErrorTemplate>
<ControlTemplate>
<StackPanel>
<!-- Placeholder for the TextBox itself -->
<AdornedElementPlaceholder x:Name="textBox"/>
<TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/>
</StackPanel>
</ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>
EmptyValidationRule class :
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (value == null)
{
return new ValidationResult(true, null);
}
if (!string.IsNullOrEmpty(value.ToString()) && !string.IsNullOrWhiteSpace(value.ToString()))
{
return new ValidationResult(true, null);
}
return new ValidationResult(false, "Dit veld is verplicht.");
}
最后是 ViewModel 中的 IsSaveButtonDisabled 属性 :
public bool IsSaveButtonEnabled
{
get
{
if (!string.IsNullOrEmpty(_productName) && !string.IsNullOrWhiteSpace(_productName))
{
return true;
}
else
{
return false;
}
}
}
我真的不知道。它必须是 ValidationRule 和检查 属性 ProductName 是否为空的组合。
编辑,按钮代码:
<Button Content="Opslagen"
IsEnabled="{Binding IsSaveButtonEnabled}"
Background="Bisque"
Width="120"
Height="30"
Command="{Binding SaveCommand}" />
产品名称属性:
private string _productName;
public string ProductName
{
get => _productName;
set
{
_productName = value;
RaisePropertyChanged(nameof(ProductName));
RaisePropertyChanged(nameof(IsSaveButtonEnabled));
}
}
保存命令是这样的:
SaveCommand = new RelayCommand(SaveProduct);
而SaveProduct只是一种保存产品的方法。这东西有用。
设置ValidationStep
属性到UpdatedValue
到运行ValidationRule
设置源属性后:
<validators:EmptyValidationRule ValidatesOnTargetUpdated="True"
ValidationStep="UpdatedValue" />
然后应调用 IsSaveButtonEnabled
属性 的 PropertyChanged
事件,即使验证规则失败,也应禁用 Button
。
情况:
当您点击新产品时,会出现一个弹出屏幕:
如您所见,“Opslagen”按钮被禁用,这很好,因为“Productnaam”是必需的。
现在,如果我开始输入“Opslagen”按钮,那么到目前为止没问题。
但是当我删除 tekst 时,一条红色消息显示该字段是必填字段,但该按钮将不再禁用:
当我再次输入内容时,红色文本再次消失。但是按钮行为没有按预期工作。
XAML :
<TextBox Width="200"
Height="30"
HorizontalAlignment="Left"
VerticalContentAlignment="Center">
<TextBox.Text>
<Binding Path="ProductName" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validators:EmptyValidationRule ValidatesOnTargetUpdated="True" ValidationStep="RawProposedValue" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
<Validation.ErrorTemplate>
<ControlTemplate>
<StackPanel>
<!-- Placeholder for the TextBox itself -->
<AdornedElementPlaceholder x:Name="textBox"/>
<TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/>
</StackPanel>
</ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>
EmptyValidationRule class :
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (value == null)
{
return new ValidationResult(true, null);
}
if (!string.IsNullOrEmpty(value.ToString()) && !string.IsNullOrWhiteSpace(value.ToString()))
{
return new ValidationResult(true, null);
}
return new ValidationResult(false, "Dit veld is verplicht.");
}
最后是 ViewModel 中的 IsSaveButtonDisabled 属性 :
public bool IsSaveButtonEnabled
{
get
{
if (!string.IsNullOrEmpty(_productName) && !string.IsNullOrWhiteSpace(_productName))
{
return true;
}
else
{
return false;
}
}
}
我真的不知道。它必须是 ValidationRule 和检查 属性 ProductName 是否为空的组合。
编辑,按钮代码:
<Button Content="Opslagen"
IsEnabled="{Binding IsSaveButtonEnabled}"
Background="Bisque"
Width="120"
Height="30"
Command="{Binding SaveCommand}" />
产品名称属性:
private string _productName;
public string ProductName
{
get => _productName;
set
{
_productName = value;
RaisePropertyChanged(nameof(ProductName));
RaisePropertyChanged(nameof(IsSaveButtonEnabled));
}
}
保存命令是这样的:
SaveCommand = new RelayCommand(SaveProduct);
而SaveProduct只是一种保存产品的方法。这东西有用。
设置ValidationStep
属性到UpdatedValue
到运行ValidationRule
设置源属性后:
<validators:EmptyValidationRule ValidatesOnTargetUpdated="True"
ValidationStep="UpdatedValue" />
然后应调用 IsSaveButtonEnabled
属性 的 PropertyChanged
事件,即使验证规则失败,也应禁用 Button
。