Поставщик ошибок в WPF

Я смотрю на компоненты WPF на панели инструментов, но не могу найти поставщика ошибок, который присутствует в 2005/2008.

Это удалено?

3 ответа

Решение

ErrorProvider - это элемент управления Winforms. В WPF нет эквивалента. Но вы все равно сможете найти в Visual Studio 2008, если вы создадите проект Win Form.

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

В.NET 3.5 добавлена ​​поддержка WPF для IDataErrorInfo: проверка данных в.NET 3.5.

Сначала извините за комментирование такой старой дискуссии, но это может помочь, так как у меня был точно такой же вопрос, и ссылка Саймона помогла мне "начать с чего-то"

Я мог бы протестировать учебник Саймона П. Стивенса, но, честно говоря, он мне не очень понравился:

  • Использование responseTemplate замедляет ответ при отображении ошибки.
  • Это работает, только если правило всегда одинаково для одного и того же класса (в моем случае у меня есть некоторые величины, которые иногда могут быть отрицательными, иногда нет).
  • В случае интернационализированного приложения (в моем случае) внешние библиотеки не имеют доступа к ресурсам, где есть переводы, поэтому я не могу установить соответствующее сообщение.

Я думаю, что использование MVVM очень хорошо приспособлено для управления любой ситуацией:

Я установил свой TextBox с BorderBrush и ToolTip, в зависимости от моих условий, я буду скрывать / отображать подсказку и цвет границы:

XAML:

<TextBox x:Name="tbName" Grid.Column="1" Grid.Row="0" Margin="3" LostFocus="tbName_LostFocus" BorderBrush="{Binding BordertbName}"
                 Text="{Binding MonRepere.Nom}" ToolTipService.ToolTip="{Binding ErrorName}" ToolTipService.IsEnabled="{Binding ToolTipNameEnable}"/>

Код позади (LostFocus = Leave, для которого используется WindowsForm):

private void tbName_LostFocus(object sender, RoutedEventArgs e)
    {
        if(tbName.Text=="")
        {
            this.mv.ErrorName = Properties.Resources.ErrorEmpty;

        }
        else
        {
            mv.ErrorName = "";
        }
    }

Тогда ViewModel:

private string errorName;
            public string ErrorName
            {
                get { return errorName; }
                set
                {
                    errorName = value;
                    if (value == "")
                    {
                        ToolTipNameEnable = false;
                        BordertbName = Brushes.Gray;
                    }
                    else
                    {
                        ToolTipNameEnable = true;
                        BordertbName = Brushes.Red;
                    }
                    this.NotifyPropertyChanged("ErrorName");
                }
            }
            private Brush bordertbName;
            public Brush BordertbName
            {
                get { return bordertbName; }
                set
                {
                    bordertbName = value;
                    this.NotifyPropertyChanged("BordertbName");
                }
            }
            private bool toolTipNameEnable;
            public bool ToolTipNameEnable
            {
                get { return toolTipNameEnable; }
                set
                {
                    toolTipNameEnable = value;
                    this.NotifyPropertyChanged("ToolTipNameEnable");
                }
            }

Просто очень полезно, когда правила специфичны в отношении ситуации.

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