Передайте TextBox.Tag в его собственный ValidationRule
Я хотел бы использовать свойство TextBox'Tag' для хранения недопустимых символов (или, в конечном итоге, строки Regex) для проверки текста. В моем простом примере я проверяю текст TextBox на наличие экземпляров "A".
У меня есть свои пользовательские ValidationRule и DependencyObjects, настроенные правильно, так что:
Это работает:
<validators:CheckStringWrapper CheckString="A" />
Но это НЕ работает:
<validators:CheckStringWrapper CheckString="{Binding Tag,RelativeSource={RelativeSource Self}}" />
... выдав следующую ошибку: Ошибка System.Windows.Data: 40: Ошибка пути BindingExpression: свойство 'Tag' не найдено в 'object' ''CheckStringWrapper' (HashCode=6677811)'. BindingExpression:Path=Tag; DataItem='CheckStringWrapper' (HashCode=6677811); целевой элемент - "CheckStringWrapper" (HashCode = 6677811); целевое свойство 'CheckString' (тип 'String')
Полный код: XAML
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- TextBox control with red border and icon image appearing at left with tool tip describing validation error -->
<ControlTemplate x:Key="ValidatedTextBoxTemplate">
<StackPanel Orientation="Horizontal">
<Image Height="16"
Margin="4,0,4,0"
Source="~/Resources/exclamation.png"
ToolTip="{Binding ElementName=ErrorAdorner,
Path=AdornedElement.(Validation.Errors).CurrentItem.ErrorContent}" />
<Border BorderBrush="Red"
BorderThickness="1"
DockPanel.Dock="Left">
<AdornedElementPlaceholder Name="ErrorAdorner" />
</Border>
</StackPanel>
</ControlTemplate>
</ResourceDictionary>
<TextBox Name="MyTextBox"
Tag="A"
Validation.ErrorTemplate="{StaticResource ValidatedTextBoxTemplate}">
<Binding Mode="TwoWay"
NotifyOnValidationError="True"
Path="NewLotName"
UpdateSourceTrigger="PropertyChanged"
ValidatesOnExceptions="True">
<Binding.ValidationRules>
<validators:InvalidFileNameChars />
<validators:InvalidPathChars />
<validators:CustomCharacterCheck>
<validators:CustomCharacterCheck.Wrapper>
<!-- This Works: <validators:CheckStringWrapper CheckString="A" /> -->
<validators:CheckStringWrapper CheckString="{Binding Tag,RelativeSource={RelativeSource Self}}" />
</validators:CustomCharacterCheck.Wrapper>
</validators:CustomCharacterCheck>
</Binding.ValidationRules>
</Binding>
</TextBox>
Классы:
public class CustomCharacterCheck : ValidationRule
{
public CheckStringWrapper Wrapper { get; set; }
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
string text = value.ToString();
if (text.Contains(Wrapper.CheckString))
{
return new ValidationResult(false, "Bad Char");
}
return ValidationResult.ValidResult;
}
}
public class CheckStringWrapper : DependencyObject
{
public static readonly DependencyProperty CheckStringProperty = DependencyProperty.Register("CheckString", typeof(string), typeof(CheckStringWrapper));
public string CheckString
{
get { return (string)GetValue(CheckStringProperty); }
set { SetValue(CheckStringProperty, value); }
}
}