Поставщик ошибок в WPF - PullRequest
3 голосов
/ 09 ноября 2009

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

Это удалено?

Ответы [ 3 ]

8 голосов
/ 09 ноября 2009

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

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

4 голосов
/ 09 ноября 2009

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

0 голосов
/ 08 марта 2018

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

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

  • Использование 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}"/>

Code Behind (LostFocus = Оставить, для кого используется 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");
                }
            }

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

...