Я пытаюсь использовать проверку в 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 я объявил стиль для TextBox. Вот декларация.
<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, поэтому использую следующий код:
<TextBox Style = "{StaticResource textBoxStyle}">
<TextBox.Text>
<Binding>
<Binding.ValidationRules>
<NotNullOrEmptyValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Ошибка возникает в теге NotNullOrEmptyValidationRule. Средство проверки синтаксиса XAML не может разрешить NotNullOrEmptyValidationRule. Я даже попытался разместить пространство имен, но, похоже, это не сработало.





Ошибка в Visual Studio и Expression Blend, которая вызывает эту проблему. Что вам нужно сделать, так это убедиться, что правило проверки находится в отдельном проекте / сборке, на которые вы можете ссылаться. Это должно решить проблему.
Однако вам придется снова добавить пространство имен, чтобы оно работало.
Вам просто нужно добавить xmlns в ваше окно и использовать его для ссылки на ваше ValidationRule.
В WPF объект отлично подходит для использования из одной и той же сборки.
Поскольку ваше правило не определено в стандартном пространстве имен XAML, вам необходимо создать сопоставление с пространством имен clr следующим образом:
<Window ...
xmlns:local = "clr-namespace:MyNamespaceName">
И тогда вы бы использовали это так:
<Binding Path = ".">
<Binding.ValidationRules>
<local:NotNullOrEmptyValidationRule />
</Binding.ValidationRules>
</Binding>
Редактировать Я добавил в привязку оператор Path. Вы должны указать привязке, к чему привязать :)
Я вижу, что ваша привязка к TextBox установлена на путь «Текст» - это поле в любом тексте этого текстового поля? действительно ли текстовое поле получает значение? кроме того, если вы поставите точку останова в свой метод проверки, будет ли он когда-либо уволен?
вы можете узнать, как регистрировать сбои привязки, и просмотреть их.
У вас нет этой строки в вашем коде позади
Public Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
Me.**NameOfTextBox**.DataContext = Me
End Sub