Отображение предупреждений аналогично ошибкам в элементе управления wpf - PullRequest
10 голосов
/ 21 января 2010

Я хотел бы отображать предупреждения и ошибки при проверке бизнес-объекта и отображать их визуально для пользователя.

Например, у меня есть класс бизнес-объектов, реализующий такой интерфейс:

interface IOrderItem : IDataErrorInfo
{
  int ProductId { get; set; }
  string ProductName { get; set; }
  decimal Price { get; set; }
  IDictionary<string, string> Warnings { get; }
}

Это связано с пользовательским интерфейсом следующим образом:

<TextBox Text="{Binding Price, ValidatesOnDataErrors=True}/>

Ошибка будет:

  • Цена <0 => "Цена не может быть меньше 0"

Это хорошо работает и рисует красную рамку вокруг текстового поля, когда я помещаю сообщение об ошибке в бизнес-объект с использованием интерфейса IDataErrorInfo.

Я хотел бы также указать предупреждения, например:

  • Цена <15 || Цена> 30 => «Цена за пределами допуска»

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

Предупреждения хранятся в строковом словаре, отображающем PropertyName => WarningMessage аналогично IDataErrorInfo.

Вопрос: Как лучше всего это сделать?

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

Ответы [ 3 ]

2 голосов
/ 28 сентября 2010

Вы проверяли это http://www.codeproject.com/KB/WPF/wpfvalidation.aspx

EDIT: Пожалуйста, найдите образец здесь http://www.filefactory.com/file/b3b4cb7/n/ValidationErrorsSample.zip

НТН

0 голосов
/ 09 октября 2010

CSLA.Net имеет элемент управления с именем PropertyStatus, который используется для этой цели (ошибка, предупреждение или информация), а также дополнительные функции, связанные с остальной частью CSLA. Но вы можете посмотреть на код (с открытым исходным кодом), как он там обрабатывается.

Кажется, что вы также можете использовать конвертер для цвета границы, привязанного к объекту (или словарь предупреждений, но со всем объектом вы можете обрабатывать ошибки также через IDataErrorInfo) с параметром конвертера, чтобы указать свойство для проверки за. Я уверен, что вы могли бы еще больше упростить это с некоторой фантазией, используя синтаксис привязки элементов или что-то в этом роде. Конвертер вернет цвет, который вы хотите отобразить.

0 голосов
/ 28 сентября 2010

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

Пример из одного из моих проектов:

<i:Interaction.Triggers>
  <ei:DataTrigger Binding="{Binding UnitData.TestState}" Value="Unknown">
      <ei:GoToStateAction StateName="UnknownState"/>
  </ei:DataTrigger>
  <ei:DataTrigger Binding="{Binding UnitData.TestState}" Value="Pass">
      <ei:GoToStateAction StateName="PassState"/>
  </ei:DataTrigger>
  <ei:DataTrigger Binding="{Binding UnitData.TestState, Mode=OneWay}" Value="Fail">
      <ei:GoToStateAction StateName="FailState"/>
  </ei:DataTrigger>
  <ei:DataTrigger Binding="{Binding UnitData.TestState, Mode=OneWay}" Value="Terminated">
      <ei:GoToStateAction StateName="FailState"/>
  </ei:DataTrigger>
  <ei:DataTrigger Binding="{Binding UnitData.TestState, Mode=OneWay}" Value="Warn">
     <ei:GoToStateAction StateName="WarnState"/>
  </ei:DataTrigger>
  <ei:DataTrigger Binding="{Binding UnitData.TestState}" Value="Indeterminate">
      <ei:GoToStateAction StateName="IndeterminateState"/>
  </ei:DataTrigger>
</i:Interaction.Triggers>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...