Проблема проверки WPF TextBox - PullRequest
0 голосов
/ 12 октября 2018

У меня есть текстовое поле с этими именами checkDescriptionTxtBox и параметр TxtBox.Оба используют одно и то же правило проверки, которое доступно в TextBoxValidator.cs.Но единственным отличием является ValidationStep = "updatedValue", добавленный в параметр TxtBox.Проверка правильности checkDescriptionTxtBox работает, как и ожидалось, но почему проверка параметра parameterTxtBox не работает? Не могли бы вы помочь кому-нибудь.

Я хочу проверить значение после обновления свойства источника.Я отладил метод проверки.Во время checkDescriptionTxtBox значение параметра проверки, передаваемое в виде строки, но когда значение параметра проверки в качестве параметраTxtBox не передается в виде строки, вместо значения привязки разницы.Поэтому я хочу проверить значение после обновления свойства источника.Как этого добиться?

<TextBox Name="checkDescriptionTxtBox" Width="700" TextWrapping="Wrap" AcceptsReturn="True" ScrollViewer.VerticalScrollBarVisibility="Auto" Validation.ErrorTemplate="{StaticResource validationErrorTemplate}">
                                <TextBox.Text>
                                    <Binding Path="CheckDescription" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                                        <Binding.ValidationRules>
                                            <v:TextBoxValidator></v:TextBoxValidator>
                                        </Binding.ValidationRules>
                                    </Binding>
                                </TextBox.Text>
                            </TextBox>

<TextBox Name="parameterTxtBox" Margin="10,0,0,0" Width="200" Height="20" Validation.ErrorTemplate="{StaticResource validationErrorTemplate}">
                                                <TextBox.Text>
                                                    <Binding Path="ParameterValue" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" >
                                                        <Binding.ValidationRules>
                                                            <v:TextBoxValidator ValidationStep="UpdatedValue"></v:TextBoxValidator>
                                                        </Binding.ValidationRules>
                                                    </Binding>
                                                </TextBox.Text>
                                            </TextBox>


    TextBoxValidator.cs    
        public class TextBoxValidator : ValidationRule
            {
             public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
                    {
                        if (String.IsNullOrEmpty(value.ToString().Trim()))
                            return new ValidationResult(false, "Value cannot be empty");

                        return ValidationResult.ValidResult;
                    }
                }

1 Ответ

0 голосов
/ 12 октября 2018

Установка для свойства ValidationStep значения UpdatedValue означает, что правило проверки будет выполняться после свойства источника было обновлено.Если исходное свойство не обновлено, правило проверки не будет запущено.Значение по умолчанию для свойства ValidationStep равно RawProposedValue, что означает, что правило проверки выполняется до преобразования значения.

Так как checkDescriptionTxtBox работает, вы должны просто удалить ValidationStep="UpdatedValue" из TextBoxValidator из parameterTxtBox.

Но я хочу проверить значение после свойства источникабыл обновленЯ отладил метод проверки.Во время checkDescriptionTxtBox значение параметра проверки передается в виде строки, но когда значение параметра проверки для параметраTTBBox не передается в виде строки, вместо значения привязки разницы.Поэтому я хочу проверить значение после обновления свойства источника.Как этого добиться?

Используйте value к BindingExpression a, используйте некоторое отражение:

public class TextBoxValidator : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        string s = null;
        BindingExpression be = value as BindingExpression;
        if(be != null)
        {
            object sourceObject = be.ResolvedSource;
            string sourceProperty = be.ResolvedSourcePropertyName;
            if(sourceObject != null && sourceProperty != null)
            {
                PropertyInfo pi = sourceObject.GetType().GetProperty(sourceProperty);
                s = pi.GetValue(sourceObject) as string;

            }
        }
        else
        {
            s = value as string;
        }

        if (string.IsNullOrEmpty(s))
            return new ValidationResult(false, "Value cannot be empty");

        return ValidationResult.ValidResult;
    }
}

В настоящее время я использую .Net 4.Я надеюсь быть. ResolvedSource;и be.ResolvedSourcePropertyName поддерживается в .Net 4.5.Тогда как я могу добиться этого в .Net 4?

Это должно работать в .NET Framework 4:

public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
    string s = null;
    BindingExpression be = value as BindingExpression;
    if (be != null)
    {
        object sourceObject = be.DataItem;
        string sourceProperty = be.ParentBinding.Path.Path;
        if (sourceObject != null && sourceProperty != null)
        {
            PropertyInfo pi = sourceObject.GetType().GetProperty(sourceProperty);
            s = pi.GetValue(sourceObject) as string;

        }
    }
    else
    {
        s = value as string;
    }

    if (string.IsNullOrEmpty(s))
        return new ValidationResult(false, "Value cannot be empty");

    return ValidationResult.ValidResult;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...