Поставщик ошибок в 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");
}
}
Просто очень полезно, когда правила специфичны в отношении ситуации.