【问题标题】:WPF MVVMLight Setter not fired on binding TextBox when validation rule is invalid当验证规则无效时,WPF MVVMLight Setter 不会在绑定 TextBox 时触发
【发布时间】:2018-03-18 03:09:14
【问题描述】:

我有一个绑定在 Mo 属性上的文本框:

<TextBox>
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Style.Setters>
                <Setter Property="Text">
                    <Setter.Value>
                        <Binding Path="Mo" UpdateSourceTrigger="PropertyChanged">
                            <Binding.ValidationRules>
                                <validator:FloatPositiveValidationRule ValidatesOnTargetUpdated="True" />
                            </Binding.ValidationRules>
                        </Binding>
                    </Setter.Value>
                </Setter>
            </Style.Setters>
        </Style>
    </TextBox.Style>
</TextBox>

这个包含一个验证规则,仅当值不为空且大于 0 时才验证控件:

public class FloatPositiveValidationRule : ValidationRule
{        
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        string str = (string)value;

        if (str.Length > 0)
        {
            double mo = Double.Parse(str.Replace(".", ","));

            if (mo > 0)
                return new ValidationResult(true, null);
            else
                return new ValidationResult(false, "Must be greater than 0");
        }
        else
            return new ValidationResult(false, "Empty");
    }
}

在我的视图模型中,当验证为假时,设置器不会被触发:

private double? _mo;
public string Mo
{
    get { return _mo.ToString(); }

    set
    {
        if (value != "")
            mo = double.Parse(value.Replace(".", ","));

        Set(ref _mo, mo);
    }
}

验证无效也可以进入setter吗?

【问题讨论】:

    标签: wpf validation data-binding mvvm-light validationrules


    【解决方案1】:

    您可以尝试将ValidationStep 属性设置为UpdatedValue

    <validator:FloatPositiveValidationRule ValidatesOnTargetUpdated="True" ValidationStep="UpdatedValue"  />
    

    这应该使验证规则在设置源属性之后运行。

    但您真正应该做的是删除ValidationRule 并在您的视图模型中实现验证逻辑,例如通过实现INotifyDataErrorInfo 接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      相关资源
      最近更新 更多