Отображение предупреждений аналогично ошибкам в управлении wpf

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

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

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 || Ценa > 30 = > "Цена за пределами допуска"

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

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

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

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

Ответ 2

Один из хороших способов сделать это - это особый стиль, который имел datatriggers в свойстве проверки (возможно, оставить 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>

Ответ 3

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

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