我正在使用控件模板使用内置的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”,是否可能?
答案 0 :(得分:2)
所以如果我理解正确你想要在没有WPF验证的情况下进行相同的验证装饰,对吗?
然后,方法实际上是重建WPF验证系统的组件:
创建依赖项属性MyCustomErrorTemplate
以将模板与控件挂钩
创建依赖项属性HasCustomError
以启用显示错误
MyCustomErrorTemplate_Changed
内与HasCustomError_Changed
联系,以便能够显示/隐藏您的装饰
创建/复制随后显示模板的TemplatedAdorner类
我建议您使用.NET Reflector或ILSpy查看以下代码,以便了解正在发生的事情。这实际上并不复杂或难以理解:
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。我认为这种简单的方法可以满足您的需求,尽管我不太确定我完全理解您的需要。