Реализация IDataErrorInfo и привязка данных - PullRequest
2 голосов
/ 11 марта 2010

Я пытаюсь изменить свойство IsEnabled кнопки, если проверка некоторых текстовых полей в моей форме возвращает true. Поэтому, если есть ошибки, для свойства IsEnabled должно быть установлено значение false.

По какой-то причине я не могу заставить его работать. Реализация IDataErrorInfo вызывается только после вызова моего свойства IsEmailValid, поэтому Validation.GetHasError всегда возвращает false и моя кнопка никогда не отключается.

Кто-нибудь может помочь?

Код:

Текстовое поле проверено с IDataErrorInfo

<TextBox Style="{StaticResource textBoxInError}" Name="txtEmail" Grid.Column="1" Grid.Row="2" Width="150" Height="23" HorizontalAlignment="Right" VerticalAlignment="Center">
            <TextBox.Text>
                <Binding Path="Email" Mode="TwoWay"
                         ValidatesOnDataErrors="True"
                         UpdateSourceTrigger="LostFocus"
                         ></Binding>
            </TextBox.Text>
        </TextBox>

Реализация IDataErrorInfo:

 public string Error
        {
            get
            {
                return null;
            }
        }

        public string this[string name]
        {
            get
            {
                string result = null;
                #region Email
                if (name == "Email")
                {
                    if (!presenter.LenientValidateEmail(Email))
                    {                      
                         result = "Your email address is not valid";

                    }

                }
                #endregion

                #region Website

                #endregion
                return result;
            }
        }

Связывание кнопок на IsEnabled

<Button Name="btnUpdate" IsEnabled="{Binding IsValid}" HorizontalAlignment="Left" Grid.Column="3" Grid.RowSpan="2" Grid.Row="6" Height="23" Width="75" Click="btnUpdate_Click">Update
        </Button>

public bool IsValid
        {
            get
            {
                return IsEmailValid();
            }
        }



public string Email
        {
            get
            {
                return _email;
            }
            set
            {
                _email = value;
                OnPropertyChanged("Email"); // executes before IDataErrorInfo Implementation
            }
        }




 private bool IsEmailValid()
    {
        object el = FindName("txtEmail");


        if (el != null)
        {
            _isEmailValid = Validation.GetHasError((DependencyObject)el); // always false??

            if (_isEmailValid)
            {
                return false;
            }
            else
                return true;
        }
        return true;

    }

//PropertyChanged event handler:
    void ProfileView_PropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                IsEmailValid();
            }

Ответы [ 2 ]

3 голосов
/ 11 марта 2010

Когда я понимаю, что ваш код правильно извлекается, я думаю, что проблема в том, что пользовательский интерфейс не уведомляется, когда введен неверный адрес электронной почты. В ProfileView_PropertyChanged (...) вы проверяете, является ли электронная почта действительной, и если она недействительна, IsEmailValid () должен вернуть false. Тем не менее, ничего не сделано с этим результатом; самое важное: пользовательский интерфейс не уведомляется об изменении свойства IsValid, и поэтому состояние кнопки IsEnabled не обновляется. Конечно, возвращаемое значение свойства IsValid изменится после ввода недействительного eMail, но пользовательский интерфейс не запрашивает это новое значение.

Решение должно заключаться в том, чтобы вызвать событие PropertyChanged для свойства IsValid в методе ProfileView_PropertyChanged (...), например:

void ProfileView_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    IsEmailValid();
    OnPropertyChanged("IsValid"); // <== this one is important!
}

Вы также можете заключить вызов OnPropertyChanged (...) в оператор if, в зависимости от результата IsEmailValid (), но это зависит от вас.

На самом деле вам даже не нужен вызов метода IsEmailValid (), потому что он будет вызываться сразу после возникновения события PropertyChanged. Однако я не хотел удалять это, потому что я не знаю, может ли это привести к какой-либо другой ошибке в вашем приложении.

1 голос
/ 11 марта 2010

Я решил это.

Использование словаря для отслеживания всех ошибок, сгенерированных IDataErrorInfo, а затем в IsEmailValid (), проверьте адрес электронной почты. Затем добавьте / удалите ошибку из словаря, если электронная почта является или не действительна! :)

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