Использование проверки в WPF с триггерами свойств и стилей зависимости - PullRequest
1 голос
/ 19 сентября 2008

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

Ответы [ 4 ]

5 голосов
/ 19 сентября 2008

Вам просто нужно добавить xmlns в ваше окно и использовать его для ссылки на ваш ValidationRule.

В WPF объект отлично подходит для использования из той же сборки.

Поскольку ваше правило не определено в стандартном пространстве имен XAML, вы должны создать отображение на ваше пространство имен clr следующим образом:

<Window ...
    xmlns:local="clr-namespace:MyNamespaceName">

И тогда вы бы использовали это так:

<Binding Path=".">
    <Binding.ValidationRules>
        <local:NotNullOrEmptyValidationRule />
    </Binding.ValidationRules>
</Binding>

Редактировать Я добавил оператор Path в Binding. Вы должны указать Binding, с чем связываться:)

1 голос
/ 03 сентября 2010

У вас нет этой строки в вашем коде позади

Public Sub New()

    ' This call is required by the Windows Form Designer.
    InitializeComponent()

    Me.**NameOfTextBox**.DataContext = Me
End Sub
1 голос
/ 19 сентября 2008

я вижу, что для вашей привязки в TextBox задан путь 'Text' - это поле для любого текстового поля этого текстового поля? действительно ли текстовое поле получает значение? Кроме того, если вы добавите точку останова в свой метод проверки, это когда-нибудь будет запущено?

Вы можете посмотреть, как регистрировать сбои в привязке, а также просмотреть их.

0 голосов
/ 19 сентября 2008

В Visual Studio и Expression Blend есть ошибка, которая вызывает эту проблему. Вам нужно убедиться, что правило проверки находится в отдельном проекте / сборке, на который вы можете ссылаться. Это должно решить проблему.

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

...