使用失败的输入验证更新数据绑定

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>