使用失败的输入验证更新数据绑定
Update data binding with faulted input vaildation
我有以下带有输入验证的 WPF 文本框。
现在的“问题”是,验证不仅仅是光学的,而且不会将错误的值写入绑定字符串。但是,我正是想要那个。验证应该只是光学的。
有什么实用的方法可以用这个设置来实现吗?在此先感谢您的任何建议!
<TextBox Width="60"
Height="20"
Style="{StaticResource TextBoxInError}"
Validation.ErrorTemplate="{StaticResource ValidationTemplate}">
<TextBox.Text>
<Binding Mode="TwoWay"
Path="BindingString"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<val:IsRealNumberRule />
<val:IsInDegreeNumberRangeRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
资源:
<Style x:Key="TextBoxInError" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" />
<Setter Property="Background" Value="LightCoral" />
</Trigger>
</Style.Triggers>
</Style>
<ControlTemplate x:Key="ValidationTemplate">
<DockPanel>
<TextBlock
Margin="2"
FontWeight="Bold"
Foreground="Red">
!
</TextBlock>
<AdornedElementPlaceholder />
</DockPanel>
</ControlTemplate>
在后面的代码中绑定了这个:
private string _BindingString= "";
public string BindingString
{
get { return _BindingString; }
set
{
if (value == _BindingString)
{
return;
}
_BindingString= value;
RaisePropertyChanged("BindingString");
}
}
输入验证规则如下所示:
public class IsInDegreeNumberRangeRule : ValidationRule
{
private const int _MinDegree = 0;
private const int _MaxDegree = 360;
public IsInDegreeNumberRangeRule()
{
}
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
int laneCount = 0;
try
{
if (((string)value).Length > 0)
laneCount = Int32.Parse((String)value);
else
return ValidationResult.ValidResult;
}
catch (Exception e)
{
return new ValidationResult(false, e.Message);
}
if ((laneCount < _MinDegree) || (laneCount > _MaxDegree))
{
return new ValidationResult(false, $"Please input value between {_MinDegree}° and {_MaxDegree}° .");
}
return ValidationResult.ValidResult;
}
}
现在的“问题”是,验证不仅仅是光学的,而且不会将错误的值写入绑定的字符串。但是,我正是想要那个。验证应该只是光学的。
有什么实用的方法可以用这个设置来实现吗?在此先感谢您的任何建议!
您可以运行验证规则在源属性更新后通过将ValidationStep
属性设置为UpdatedValue
:
<Binding.ValidationRules>
<val:IsRealNumberRule ValidationStep="UpdatedValue" />
<val:IsInDegreeNumberRangeRule ValidationStep="UpdatedValue" />
</Binding.ValidationRules>
我有以下带有输入验证的 WPF 文本框。 现在的“问题”是,验证不仅仅是光学的,而且不会将错误的值写入绑定字符串。但是,我正是想要那个。验证应该只是光学的。
有什么实用的方法可以用这个设置来实现吗?在此先感谢您的任何建议!
<TextBox Width="60"
Height="20"
Style="{StaticResource TextBoxInError}"
Validation.ErrorTemplate="{StaticResource ValidationTemplate}">
<TextBox.Text>
<Binding Mode="TwoWay"
Path="BindingString"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<val:IsRealNumberRule />
<val:IsInDegreeNumberRangeRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
资源:
<Style x:Key="TextBoxInError" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" />
<Setter Property="Background" Value="LightCoral" />
</Trigger>
</Style.Triggers>
</Style>
<ControlTemplate x:Key="ValidationTemplate">
<DockPanel>
<TextBlock
Margin="2"
FontWeight="Bold"
Foreground="Red">
!
</TextBlock>
<AdornedElementPlaceholder />
</DockPanel>
</ControlTemplate>
在后面的代码中绑定了这个:
private string _BindingString= "";
public string BindingString
{
get { return _BindingString; }
set
{
if (value == _BindingString)
{
return;
}
_BindingString= value;
RaisePropertyChanged("BindingString");
}
}
输入验证规则如下所示:
public class IsInDegreeNumberRangeRule : ValidationRule
{
private const int _MinDegree = 0;
private const int _MaxDegree = 360;
public IsInDegreeNumberRangeRule()
{
}
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
int laneCount = 0;
try
{
if (((string)value).Length > 0)
laneCount = Int32.Parse((String)value);
else
return ValidationResult.ValidResult;
}
catch (Exception e)
{
return new ValidationResult(false, e.Message);
}
if ((laneCount < _MinDegree) || (laneCount > _MaxDegree))
{
return new ValidationResult(false, $"Please input value between {_MinDegree}° and {_MaxDegree}° .");
}
return ValidationResult.ValidResult;
}
}
现在的“问题”是,验证不仅仅是光学的,而且不会将错误的值写入绑定的字符串。但是,我正是想要那个。验证应该只是光学的。
有什么实用的方法可以用这个设置来实现吗?在此先感谢您的任何建议!
您可以运行验证规则在源属性更新后通过将ValidationStep
属性设置为UpdatedValue
:
<Binding.ValidationRules>
<val:IsRealNumberRule ValidationStep="UpdatedValue" />
<val:IsInDegreeNumberRangeRule ValidationStep="UpdatedValue" />
</Binding.ValidationRules>