Проверка текстового поля в формате WPF, как должна выглядеть привязка?

#.net #wpf #validation #xaml #textbox

#.net #wpf #проверка #xaml #текстовое поле

Вопрос:

Я пытаюсь проверить текстовое поле в WPF. Я нашел несколько примеров в Интернете и собрал некоторые вещи. Но прямо сейчас он просто проверяет все, как если бы это было неправильно. Мне сказали, что это моя привязка, поскольку я не уверен, что привязывать к тому, к чему я пришел сюда за некоторыми разъяснениями 🙂

Вот мой валидатор:

 class TextRangeValidator : ValidationRule
    {
        private int _minimumLength = 0;
        private int _maximumLength = 0;
        private string _errorMessage;

        public int MinimumLength
        {
            get { return _minimumLength; }
            set { _minimumLength = value; }
        }

        public int MaximumLength
        {
            get { return _maximumLength; }
            set { _maximumLength = value; }
        }

        public string ErrorMessage
        {
            get { return _errorMessage; }
            set { _errorMessage = value; }
        }

        public override ValidationResult Validate(object value,
            CultureInfo cultureInfo)
        {
            ValidationResult result = new ValidationResult(true, null);
            string inputString = (string)value.ToString();
            if (inputString.Length < this.MinimumLength ||
                (
                 inputString.Length > this.MaximumLength))
            {
                result = new ValidationResult(false, this.ErrorMessage);
            }
            return resu<
        }
    }
  

Вот мой код xaml:

 <TextBox Height="23" HorizontalAlignment="Left" Margin="118,60,0,0" Name="CreateUserCPRTextbox" VerticalAlignment="Top" Width="120" >
    <TextBox.Text >
        <Binding Path="Name" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="true">
            <Binding.ValidationRules  >
                <validators:TextRangeValidator
                    ValidatesOnTargetUpdated="True"
                    MinimumLength="10"
                    MaximumLength="10"
                    ErrorMessage="CPR nummer ikke gyldigt" />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
  

Прямо сейчас мое свойство привязки называется просто name, я попытался привязать его к CreateUserCPRTextbox.Текст, но это не работает. Как это работает?

Комментарии:

1. Я также пытался создать свойство в файле xaml.cs и привязать к нему текстовое поле. это тоже не помогло.

Ответ №1:

Вы должны привязать его к источнику и пути, например, к следующему простому объекту:

 public  class Class1
{
    public string Name { get; set; }
}
  

Объект может быть создан путем добавления его в window своей коллекции ресурсов.
Источник привязывается к объекту и пути к его свойству [Name], которое в этом примере равно «0123456789».

 <Window.Resources>
    <validators:Class1 x:Key="class1" Name="0123456789" />
</Window.Resources>
  

Наконец, вы должны привязать его источник к этому ресурсу с помощью Source={StaticResource class1}

 <Grid>
    <TextBox Height="23" HorizontalAlignment="Left" Margin="118,60,0,0" Name="CreateUserCPRTextbox" VerticalAlignment="Top" Width="120" >
        <TextBox.Text >
            <Binding Source="{StaticResource class1}" Path="Name" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="true">
                <Binding.ValidationRules  >
                    <validators:TextRangeValidator ValidatesOnTargetUpdated="True" MinimumLength="10" MaximumLength="10" ErrorMessage="CPR nummer ikke gyldigt" />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
</Grid>
  

Затем вы можете немного поиграть с проверенным текстовым полем.

Комментарии:

1. Итак, я должен создать новый класс c # только для того, чтобы иметь свойство, к которому может привязываться текстовое поле? — Таким образом, у меня мог бы быть класс для всех свойств, которые я хочу проверить?

2. Ты только что сделал мой день лучше, у меня так долго были проблемы с этим. Теперь мне просто интересно. Почему я не мог просто не указывать путь Textbox.text? Разве это тоже не свойство?

3. Обычно вы хотите привязать textbox.text к чему-то, что можно проверить, а не к самому себе. Это просто не имеет смысла. Входные данные должны поступать куда-то в логику приложения. Конечно, вы можете установить его на любой источник (данных).