#.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 к чему-то, что можно проверить, а не к самому себе. Это просто не имеет смысла. Входные данные должны поступать куда-то в логику приложения. Конечно, вы можете установить его на любой источник (данных).