Использование проверки в WPF с триггерами свойства зависимости и стиля

Я пытаюсь использовать проверку в 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. Я даже попытался разместить пространство имен, но, похоже, это не сработало.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
7 558
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ошибка в 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

Другие вопросы по теме