預設的 Validation.ErrorTemplate(如紅色邊框)不會隨被驗證控件的 Visibility 變化而自動顯隱。即使將控件放入 Expander 摺疊,錯誤模板仍殘留於畫面,造成使用者困擾。
根本原因:Visibility 屬性不會向下傳遞給視覺樹中的裝飾器。父容器隱藏時,子元素的 Visibility 仍為 Visible,導致 AdornedElementPlaceholder 所在的 Border 仍可見。
IsVisible 配合轉換器UIElement.IsVisible 為唯讀屬性,能真實反映元素在畫面上是否可見。搭配 BooleanToVisibilityConverter 即可實現同步。
<BooleanToVisibilityConverter x:Key="BoolToVis" />
<ControlTemplate x:Key="ValidationTemplate">
<Border BorderBrush="Red" BorderThickness="2"
Visibility="{Binding ElementName=Holder, Path=AdornedElement.IsVisible,
Converter={StaticResource BoolToVis}}">
<AdornedElementPlaceholder x:Name="Holder" />
</Border>
</ControlTemplate>
此寫法確保錯誤模板僅在被驗證控件真正可見時顯示,解決摺疊、標籤頁切換等場景下的殘留問題。