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

StackOverflow https://stackoverflow.com/questions/96377

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

Однако вам придется добавить обратно пространство имен, чтобы оно заработало.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top