IDataErrorInfo - не появляется ни одного сообщения об ошибке, даже если оно поднято - PullRequest
2 голосов
/ 26 апреля 2011

У меня есть ItemType, который реализует все, что нужно для проверки с помощью интерфейса IDataErrorInfo:

#region IDataErrorInfo implementation
        //WPF doesn't need this one
        public string Error
        { get { return null; } }

        public string this[string propertyName]
        {
            get { return GetValidationError(propertyName); }
        }
        #endregion

        #region Validation
        public bool IsValid
        {
            get
            {
                foreach (string property in ValidatedProperties)
                {
                    if (GetValidationError(property) != null)
                    {
                        return false;
                    }
                }

                return true;
            }
        }

        static readonly string[] ValidatedProperties =
        {
            "Name"
        };

        private string GetValidationError(string propertyName)
        {
            if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                return null;

            string error = null;

            switch (propertyName)
            {
                case "Name":
                    error = ValidateName();
                    break;
                default:
                    Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                    break;
            }

            return error;
        }

        string ValidateName()
        {
            if (!IsStringMissing(Name))
            {
                return "Name can not be empty!";
            }

            return null;
        }

        static bool IsStringMissing(string value)
        {
            return string.IsNullOrEmpty(value) ||
                   value.Trim() == String.Empty;
        }
        #endregion

ItemType оборачивается ItemViewModel. На ItemViewModel у меня есть команда, когда пользователь нажимает кнопку Сохранить:

public ICommand SaveItemType
        {
            get
            {
                if (saveItemType == null)
                {
                    saveItemType = new RelayCommand(() => Save());
                }

                return saveItemType;
            }
        }

Затем в DetailsView у меня есть следующий код xaml:

<TextBlock Text="Name:" />
<TextBox Grid.Column="1" Name="NameTextBox" Text="{Binding Name, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
                         Validation.ErrorTemplate="{x:Null}" />

<ContentPresenter Grid.Row="13" Grid.Column="2"
                  Content="{Binding ElementName=NameTextBox, Path=(Validation.Errors).CurrentItem}" />

происходит следующая архитектура (неясно, но форма на самом деле представляет собой независимый файл xaml (пользовательский элемент управления), где тексту данных сетки в форме задано значение ObservableCollection):

<Grid DataContext="{Binding Items}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>

enter image description here

У меня проблема в том, что сообщения об ошибках не отображаются. Когда я ставлю точку останова и проверяю, правильно ли она проверяется и есть ли у меня какие-либо сообщения об ошибках, они у меня появляются. Но почему-то сообщение об ошибке не приходит в xaml.

Что такое недостающий кусочек головоломки?

РЕДАКТИРОВАТЬ - ОТСУТСТВУЮЩАЯ ЧАСТЬ

Правильно, вот что было следующим:

Я реализовал IDataErrorInfo на моей модели, но не на ViewModel, который оборачивает модель. Что мне нужно было сделать, так это реализовать интерфейс IDataErrorInfo в ViewModel и получить его из модели.

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

{ get { return (ItemType as IDataErrorInfo).Error; } }

public string this[string propertyName]
{
  get
  {
    return (ItemType as IDataErrorInfo)[propertyName];
  }
}

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Я использую следующий стиль, чтобы видеть, происходит ли моя проверка или нет.

<Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
    <Style.Triggers>>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{Binding Path=(Validation.Errors).CurrentItem.ErrorContent, RelativeSource={x:Static RelativeSource.Self}}"/>
            <Setter Property="Background" Value="{StaticResource BrushErrorLight}" />
        </Trigger>
    </Style.Triggers>
</Style>

вы должны увидеть сообщение проверки в вашей подсказке

РЕДАКТИРОВАТЬ:

попытатьсядобавить NotifyOnValidationError = true к вашей привязке

<TextBox Grid.Column="1" Name="NameTextBox" 
         Text="{Binding Name, ValidatesOnDataErrors=True, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged}" />
0 голосов
/ 10 декабря 2013

У меня была похожая проблема, и я исправил ее, поместив проверенный элемент внутрь AdornerDecorator .Может стоит попробовать.

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