ページ内のすべてのテキスト ボックスにカスタム検証ルールを設定する際に問題が発生しています。
1つのテキストボックスに設定する方法を知っています:
<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"/>
2つのうちの1つ(私がやっているように設定しますが、すべてのテキストボックスを一度に設定します)または上記で示した例は本当にありがたいです。