Использование проверки в WPF с триггерами свойств зависимостей и стилей
-
01-07-2019 - |
Вопрос
Я пытаюсь использовать проверку в WPF.Я создал NotNullOrEmptyValidationRule, как показано ниже:
public class NotNullOrEmptyValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (String.IsNullOrEmpty(value as String))
return new ValidationResult(false, "Value cannot be null or empty");
return new ValidationResult(true, null);
}
}
Теперь мне нужно использовать его в моем приложении.В моем файле App.xaml я объявил Стиль для текстового поля.Вот декларация.
<Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Green"/>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background" Value="Red"/>
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
Теперь я хочу использовать его в своем текстовом поле, поэтому я использую следующий код:
<TextBox Style="{StaticResource textBoxStyle}">
<TextBox.Text>
<Binding>
<Binding.ValidationRules>
<NotNullOrEmptyValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Ошибка приходит по тегу NotNullOrEmptyValidationRule.Средство проверки синтаксиса XAML не способно разрешить NotNullOrEmptyValidationRule.Я даже пытался указать пространство имен, но, похоже, это не работает.
Решение
я вижу, что ваша привязка к текстовому полю установлена на путь 'Text' - это поле для любого datacontext этого текстового поля?действительно ли текстовое поле получает вложенное в него значение?кроме того, если вы устанавливаете точку останова в своем методе проверки, это когда-нибудь срабатывает?
возможно, вы захотите посмотреть, как регистрировать сбои в привязке, и также просмотреть их..
Другие советы
Вам просто нужно добавить xmlns в ваше окно и использовать это для ссылки на ваше ValidationRule.
В WPF объект идеально подходит для использования из той же сборки.
Поскольку ваше правило не определено в стандартном пространстве имен XAML, вам необходимо создать сопоставление с вашим пространством имен clr следующим образом:
<Window ...
xmlns:local="clr-namespace:MyNamespaceName">
И тогда вы бы использовали это следующим образом:
<Binding Path=".">
<Binding.ValidationRules>
<local:NotNullOrEmptyValidationRule />
</Binding.ValidationRules>
</Binding>
Редактировать Я добавил инструкцию Path к привязке.Вы должны указать Привязке, к чему привязывать :)
У вас нет этой строки в коде ur позади
Public Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
Me.**NameOfTextBox**.DataContext = Me
End Sub
В Visual Studio и Expression Blend есть ошибка, которая вызывает эту проблему.Что вам нужно сделать, так это убедиться, что правило проверки находится в отдельном проекте / сборке, на которую вы можете ссылаться.Это должно решить проблему.
Однако вам придется добавить обратно пространство имен, чтобы оно заработало.