以与wpf控件上的错误类似的方式显示警告

时间:2010-01-21 10:50:18

标签: c# wpf

我想在验证业务对象时显示警告和错误,并以可视方式显示给用户。

例如,我有一个实现如下界面的业务对象类:

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

这与UI绑定如下:

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

错误是:

  • 价格&lt; 0 =&gt; “价格不能低于0”

当我使用IDataErrorInfo界面将错误消息放在业务对象上时,这很好用并在文本框周围绘制一个红色边框。

我想要做的还是指定警告,例如:

  • 价格&lt; 15 ||价格&gt; 30 =&gt; “价格超出容忍度”

这些警告会在文本框周围放置橙色边框,并告知用户可能存在问题,但不会阻止它们继续运行。

警告存储在映射PropertyName =&gt;的字符串字典中。 WarningMessage与IDataErrorInfo的方式类似。

问题:最好的方法是什么?

  • 显然我需要一个包含文本框橙色边框的样式,但是如何触发呢?
  • 我真的不希望每个文本框都有单独的样式,所以样式如何访问底层绑定以获取它应该在Dictionary中查找的属性名称。

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

执行此操作的一个好方法是在验证属性上具有数据触发器的自定义样式(可能是远程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>

答案 2 :(得分:0)

CSLA.Net有一个名为PropertyStatus的控件,用于此目的(错误,警告或信息),以及与CSLA其余部分相关的其他功能。但是你可能会看一下代码(开源)的处理方式。

看起来你也可以在绑定到对象的边框颜色上使用转换器(或警告字典,但是整个对象也可以通过IDataErrorInfo处理错误),并使用转换器参数来指定要检查的属性对于。我相信你可以使用元素绑定语法或其他东西来进一步简化这一点。转换器将返回您想要显示的颜色。

答案 3 :(得分:0)

如果您的错误对象是错误/警告/信息/,则可以使用自己的错误对象以及包含信息的属性。.您可以在on the authors blog或{{3 }}