IDataErrorInfo и проверка привязки ненулевых свойств

Я использую IDataError для проверки свойств моих объектов в моих элементах управления и текстовых полях. В моем классе я добавил несколько проверок, а затем добавил привязку к элементам управления textbox.

Это мой класс:

public class Customer : IDataErrorInfo
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public long TributaryCode { get; set; }

        #region IDataErrorInfo Members

        public string Error
        {
            get { throw new NotImplementedException(); }
        }

        public string this[string columnName]
        {
            get
            {
                string result = null;
                if (columnName == "FirstName")
                {
                    if (string.IsNullOrEmpty(FirstName))
                        result = "Please enter a First Name";
                }
                if (columnName == "LastName")
                {
                    if (string.IsNullOrEmpty(LastName))
                        result = "Please enter a Last Name";
                }
                return result;
            }
        }

        #endregion
    }

У меня проблема в том, что когда TributaryCode пуст, я получаю исключение, которое говорит, что он не может преобразовать значение ''. Это очевидно, потому что трибутарный код является длинным и не поддерживает нулевые значения. Кроме того, когда пользовательский элемент управления, содержащий текстовое поле, загружается, значение появляется в 0. То, что я хочу, это начинать с пустого, а когда текстовое поле пустое, чтобы не генерировать это исключение.

Тогда что мне нужно делать? Должен ли я написать все свойства как обнуляемые? Затем эти классы переводятся в классы запросов службы WCF, так что это возможное решение, но я хотел спросить, верно ли это.

Также, как я уже сказал, все эти элементы управления находятся в UserControl. У меня есть одно окно, которое содержит ScrollViewer, который содержит этот UserControl. Проверки выполняются в событии LostFocus текстовых полей, но по какой-то причине, когда окно загружает и загружает UserControl, все мои пустые текстовые поля уже имеют красную рамку, указывающую, что он не прошел проверку. Почему это может происходить? Я думаю, это должно быть связано с элементом UserControl.

Это одно из моих текстовых полей XAML:

<TextBox x:Name="tbFirstName" Grid.Row="0" Grid.Column="1"
     Text="{Binding UpdateSourceTrigger=LostFocus, Path=FirstName,
            ValidatesOnDataErrors=true, NotifyOnValidationError=true}" />

Спасибо!

1 ответ

Решение

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

У меня проблема в том, что когда TributaryCode пуст, я получаю исключение, которое говорит, что он не может преобразовать значение ''

Если это действительно беспокоит вас, у вас есть ряд решений; Вы можете инициализировать значение с 0; Вы могли бы добавить PreviewKeyDown обработчик, позволяющий только long ценности; Вы могли бы использовать nullable long:

public long? TributaryCode { get; set; }

когда окно загружает и загружает UserControl, все мои пустые текстовые поля уже имеют красную рамку, указывающую, что оно не прошло проверку

Опять же, это нормально... что еще вы ожидали, когда свойства не имеют значений? Это называется предиктивной проверкой, когда пользователь получает предупреждение об ошибках перед попыткой сохранения. Лично я предпочитаю эту систему, так как пользователь всегда знает, что он может и не может сделать.

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