У меня возникают проблемы с настройкой пользовательского правила проверки для всех моих текстовых полей на странице.
Я знаю, как установить его для одного текстового поля:
<TextBox Margin="79,118,79,121" Name="textBox1" Style="{Binding EmptyTextboxValidator, UpdateSourceTrigger=PropertyChanged}">
<TextBox.Text>
<Binding Path="Text" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validators:StringRangeValidationRule MinimumLength="1" ErrorMessage="Text is te kort" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Однако, если мне нужно добавить этот код для каждого отдельного текстового поля, я не уверен, что это так же полезно, так как было бы очень много копий и вставок. Должен же быть более простой способ?
если я много искал, но я не смог найти пример, чтобы установить его для всех текстовых полей, только примеры, чтобы установить его для 1 одного текстового поля (как показано выше)
вот код стиля текстового поля:
<Application.Resources>
<Style x:Key="EmptyTextboxValidator" TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<Border BorderBrush="Red" BorderThickness="3">
<AdornedElementPlaceholder Name="MyAdorner" />
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
</Application.Resources>
и код правила проверки:
using System;
using System.Windows.Controls;
using System.Globalization;
namespace MyValidators
{
public class StringRangeValidationRule : ValidationRule
{
private int _minimumLength = 1;
private string _errorMessage;
public int MinimumLength
{
get { return _minimumLength; }
set { _minimumLength = 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 = (value ?? string.Empty).ToString();
if (string.IsNullOrEmpty(inputString) || inputString.Length < MinimumLength)
{
result = new ValidationResult(false, this.ErrorMessage);
}
return result;
}
}
}
модель представления:
public class Data : INotifyPropertyChanged
{
private int id = -1;
private bool updated = true;
private string text;
private string name;
public int ID
{
get
{
return id;
}
set
{
id = value;
OnPropertyChanged("ID");
}
}
public bool Updated
{
get
{
return updated;
}
set
{
updated = value;
}
}
public string Text
{
get
{
return text;
}
set
{
text = value;
OnPropertyChanged("Text");
}
}
public string Name
{
get
{
return name;
}
set
{
name = value;
OnPropertyChanged("Name");
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
updated = true;
}
#endregion
}
Кроме того, мои знания о xaml ограничены, и этот код был частью теста, который я провел, чтобы лучше понять xaml.
Также может быть способ просто добавить поле в текстовое поле, например:
<TextBox ValidateStringLength="true"/>
или даже лучше, если бы я мог просто указать целочисленный параметр для минимальной длины строки:
<TextBox ValidateStringLength="5"/>
Либо один из двух (устанавливая его так, как я, но для всех текстовых полей сразу), либо пример, который я продемонстрировал выше, будет действительно оценен.