Проблема проверки TextBox - PullRequest
       2

Проблема проверки TextBox

1 голос
/ 14 сентября 2011

Я пытаюсь получить текстовое поле для проверки в WPF. Проблема заключается в том, что когда в текстовое поле не введены данные, которые должны вызвать ошибку проверки, ошибка проверки не отображается. Может ли кто-нибудь помочь мне? Заранее спасибо. Вот мой код

public class User
    {
        private string _name;

        public string myName
        {
            get { return _name; }
            set
            {
                _name = value;
                if (String.IsNullOrEmpty(value))
                {
                    throw new ApplicationException("User name is mandatory.");
                }
            }
        }
    }
<TextBox Height="23"
                 HorizontalAlignment="Right"
                 Margin="0,0,194,250" Name="textBox1"
                 VerticalAlignment="Bottom"
                 Width="120" >
                <TextBox.Text>
                    <Binding Path="myName" >
                        <Binding.ValidationRules>
                            <ExceptionValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
        </TextBox>

Редактировать: У меня действительно была проблема с привязкой. Я исправил свой код, вот он: Я начал с создания пользователя и шаблона ошибки:

<local:User x:Key="myDataSource" myName="Enter Name" />

        <ControlTemplate x:Key="validationTemplate">
            <DockPanel>
                <TextBlock Foreground="Red" FontSize="20">!!!</TextBlock>
                <AdornedElementPlaceholder/>
            </DockPanel>
        </ControlTemplate>

После этого у меня была отключена кнопка сохранения, если были ошибки проверки

<Button Content="Write Kml"
                Height="23"
                HorizontalAlignment="Right"
                Margin="0,0,12,41"
                Name="writeKml"
                VerticalAlignment="Bottom"
                Width="75" Click="button2_Click" >
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="IsEnabled" Value="false" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=textBox1, Path=(Validation.HasError)}" Value="false">
                            <Setter Property="IsEnabled" Value="true" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>

Затем я исправил textBox, чтобы обеспечить правильную проверку

<TextBox Height="23"
                 HorizontalAlignment="Right"
                 Margin="0,0,194,250"
                 Name="textBox1"
                 VerticalAlignment="Bottom"
                 Validation.ErrorTemplate="{StaticResource validationTemplate}"
                 Width="120" >
                <TextBox.Text>
                    <Binding
                        Source="{StaticResource myDataSource}"
                        Path="myName"
                        UpdateSourceTrigger="PropertyChanged"
                        ValidatesOnExceptions="True"
                        ValidatesOnDataErrors="True" >
                        <Binding.ValidationRules>
                            <local:CheckName />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
        </TextBox>

вот код

public class User
    {
        private string _name;

        public string myName
        {
            get { return _name; }
            set { _name = value; }
        }
    }

    public class CheckName : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            if (value == null || object.Equals(value, string.Empty))
            {
                return new ValidationResult(false, "Please enter user name");
            }

            if (value.ToString() == "Enter Name")
            {
                return new ValidationResult(false, "Please enter user name");
            }

            return new ValidationResult(true, null);
        }
    }

наконец, я добавил код в подпрограмму, загруженную в окно, для принудительной проверки

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            textBox1.GetBindingExpression(TextBox.TextProperty).UpdateSource();
        }

Надеюсь, это поможет любому, кто пытается выполнить проверку текстового поля в WPF.

1 Ответ

2 голосов
/ 14 сентября 2011

Вашему классу User необходимо реализовать INotifyPropertyChanged, чтобы он мог поддерживать привязку данных в WPF. Скорее всего, вам придется немного почитать о WPF и привязке данных, поскольку это фундаментальные знания, необходимые для создания приложений WPF (или Silverlight).

Несколько ссылок для начала работы:

Обзор привязки данных

Интерфейс INotifyPropertyChanged

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...