【问题标题】:Displaying warnings in a similar way to errors on a wpf control以与 wpf 控件上的错误类似的方式显示警告
【发布时间】:2010-01-21 10:50:18
【问题描述】:

我想在验证业务对象时显示警告和错误,并将它们直观地显示给用户。

例如,我有一个业务对象类实现这样的接口:

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}/>

一个错误是:

  • 价格 "价格不能低于 0"

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

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

  • 价格 30 => “价格超出公差范围”

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

警告以类似于IDataErrorInfo 的方式存储在字符串字典映射 PropertyName => WarningMessage 中。

问题:解决此问题的最佳方法是什么?

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

【问题讨论】:

标签: c# wpf


【解决方案1】:

【讨论】:

  • 该项目中的 ErrorProvider 似乎以引发错误的替代方法为中心,而不是区分错误和警告的方法。
  • 你是对的。这看起来比我看起来的要大得多。但是,您可以通过使用所需值标记异常数据来实现此目的。
  • 我无法从当前站点访问 FileFactory;我会在大约 2 小时左右检查它。
  • filefactory链接失效,但是可以从codeproject下载文件(需要注册)
【解决方案2】:

实现此目的的一个好方法是在验证属性(可能是 leftarge 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>

【讨论】:

  • 您在此处绑定到 UnitData.TestState。我追求的想法是能够有效地重现您的绑定,直到运行时才知道属性的名称 (UnitData.TestState),最好以某种方式重新使用当前列的当前值绑定。
  • 这听起来很像我想要表达的意思;您有引用您自己的绑定的语法示例吗?
  • TestEntry="{Binding SelectedItem.ValidationState, ElementName=testListBox}"
【解决方案3】:

CSLA.Net 有一个名为 PropertyStatus 的控件用于此目的(错误、警告或信息),以及与 CSLA 的其余部分相关的附加功能。但是您可能会查看代码(开源)以了解它是如何处理的。

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

【讨论】:

    【解决方案4】:

    有可能使用您自己的错误对象和一个属性,如果它是错误/警告/信息/..您可以在“自定义错误对象”一章找到它on the authors blogon technet

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 2012-01-24
      • 2021-03-25
      • 2011-02-01
      • 1970-01-01
      相关资源
      最近更新 更多