WPF MVVMLight Setter не запускается при привязке TextBox, когда правило проверки недействительно

У меня есть TextBox с привязкой к свойству 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);
    }
}

Можно ли войти в сеттер, даже если валидация недействительна?


person Speed Neo    schedule 06.10.2017    source источник


Ответы (1)


Вы можете попробовать установить для свойства ValidationStep значение UpdatedValue:

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

Это должно заставить правило проверки запускаться после установки свойства источника.

Но на самом деле вам следует удалить ValidationRule и реализовать логику проверки в вашей модели представления, например, путем реализации интерфейс INotifyDataErrorInfo.

person mm8    schedule 06.10.2017