【问题标题】:How to use Validation template without the Validation mechanism?如何在没有验证机制的情况下使用验证模板?
【发布时间】:2012-04-02 21:38:01
【问题描述】:

我正在使用控件模板来显示每个控件上的验证错误,使用内置 WPF 的验证机制,一切正常。 controlTemplate 如下所示:

<ControlTemplate x:Key="MyErrorTemplate" TargetType="{x:Type Control}">
    <StackPanel Orientation="Horizontal">
        <Border BorderBrush="Red" BorderThickness="2" CornerRadius="3">
            <AdornedElementPlaceholder Name="MyAdorner" />
        </Border>
        <Image Name="imgError" 
               Source="/MyAssembly;component/Images/ValidationIcon.png"
               ToolTip="{Binding ElementName=MyAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/>
    </StackPanel>
</ControlTemplate>

我已经读到,只要控件出错,验证机制就会将经过验证的控件与控件模板(默认模板或上述自定义模板)一起包装起来。

"当 WPF 验证系统检测到它创建的无效控件时 和装饰器,它持有一个控件(...),将一个控件插入其中并设置该控件 模板到附加的 Validation.ErrorTemplate 的内容 属性。

它将装饰器定位在原始控件之上,以便 AdornedElementPlaceholder 正好在控件之上,这让我们 轻松将控件模板内容相对于原始内容放置 控制”(see more)

如何为其他功能执行相同的行为?我的意思是在没有 WPF 验证系统的情况下使用“MyErrorTemplate”,可以吗?

【问题讨论】:

  • 您在寻找 IDataErrorInfo 接口吗? WPF 使用此接口来验证对象。 (见这里japikse.blogspot.fr/2009/07/…
  • 不,我不是。我想在不使用验证机制的情况下将相同的验证模板分配给控件

标签: wpf validation


【解决方案1】:

所以,如果我理解正确,您希望在没有 WPF 验证的情况下拥有相同的验证装饰,对吧?

那么这个方法实际上就是重新构建 WPF 的验证系统的组件:

  1. 创建一个依赖属性MyCustomErrorTemplate 将您的模板连接到控件

  2. 创建一个依赖属性HasCustomError 以启用显示错误

  3. MyCustomErrorTemplate_Changed 内连接到 HasCustomError_Changed 以显示/隐藏您的装饰物

  4. 创建/复制 TemplatedAdorner 类,然后显示您的模板

我建议您使用.NET ReflectorILSpy 查看以下代码以了解发生了什么。这实际上并不是很复杂或难以理解:

在 PresentationFramework.dll 中:

  • System.Windows.Controls.Validation(尤其是private static void ShowValidationAdornerHelper(DependencyObject targetElement, DependencyObject adornerSite, bool show, bool tryAgain)

  • MS.Internal.Controls.TemplatedAdorner(遗憾的是这是内部的,所以您要么必须复制它,要么对其使用反射)

【讨论】:

    【解决方案2】:

    为什么不呢?您可以拥有类似的附加属性 MyValidation.Errors 和 HasErrors 并用您的自定义逻辑填充它们。当 HasError 为真时,您可以使用触发器将 ControlTemplate 替换为 ErrorTemplate。我认为这种简单的方法可以满足您的需要,尽管我不太确定我是否完全理解您的需要。

    【讨论】:

    • 我想像验证机制一样使用模板。我正在动态创建控件,但无法使用绑定,因此我想分配一个带有错误(手动验证)标记的控件。
    猜你喜欢
    • 2011-04-18
    • 2011-02-12
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2018-07-21
    相关资源
    最近更新 更多