如何在没有验证机制的情况下使用验证模板?

时间:2012-04-02 21:38:01

标签: wpf validation

我正在使用控件模板使用内置的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”,是否可能?

2 个答案:

答案 0 :(得分:2)

所以如果我理解正确你想要在没有WPF验证的情况下进行相同的验证装饰,对吗?

然后,方法实际上是重建WPF验证系统的组件:

  1. 创建依赖项属性MyCustomErrorTemplate以将模板与控件挂钩

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

  3. MyCustomErrorTemplate_Changed内与HasCustomError_Changed联系,以便能够显示/隐藏您的装饰

  4. 创建/复制随后显示模板的TemplatedAdorner类

  5. 我建议您使用.NET ReflectorILSpy查看以下代码,以便了解正在发生的事情。这实际上并不复杂或难以理解:

    PresentationFramework.dll中的

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

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

答案 1 :(得分:0)

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