带验证的WPF TextBox失去了ErrorTemplate

时间:2016-12-15 16:40:20

标签: wpf validation textbox tabcontrol adornerdecorator

我有一个非常类似的问题:

Importing .csv with timestamp column (dd.mm.yyyy hh.mm.ss) using psql \copy

Issue with WPF validation(IDataErrorInfo) and tab focusing

WindowWindow的同一实例中执行操作,但重新加载TabItem后我切换到TextBox如果错误中包含ErrorTemplate,则<Window x:Class="Views.MyWindowView"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TabControl HorizontalAlignment="Stretch" Height="Auto" VerticalAlignment="Top" Width="Auto" SelectionChanged="TabItemChanged" Name="MyTabControl"> <!-- Below, AdornerDecorator are added for the following reason: the Validation.Error cues are painted in the Adorner Layer. When tabs are switched, that layer is discarded. --> <!-- The view 1 tab.--> <TabItem Header="{Resx tab1_Header}" Name="Tbi1"> <AdornerDecorator> <vw:MyView1 DataContext="{Binding}"/> </AdornerDecorator> </TabItem> <!-- The view 2 tab.--> <TabItem Header="{Resx tab2_Header}" Name="Tbi2"> <AdornerDecorator> <vw:MyView2 DataContext="{Binding}"/> </AdornerDecorator> </TabItem> </TabControl> 将不再显示

TabControl

...

我试图在SelectionChanged position:fixed的代码隐藏中重新启动验证,但是没有用。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

整理拼图的各个部分

AdornerLayer表示用于渲染装饰者的曲面。 由于#[attribute]通常提供整个视图,而不仅仅是一个控件,因此某些容器默认实现它们。

adorner是绑定到AdornerLayer的自定义FrameworkElement。装饰体以UIElement呈现,这是一个始终位于装饰元素或装饰元素集合之上的渲染表面。

因此,在这种情况下,装饰器(红色矩形)绑定到AdornerLayer,但会在TextBox之上的图层中呈现。

通过调用静态方法TextBox来完成装饰(例如,在验证错误的情况下),以获得GetAdornerLayer装饰AdornerLayer的对象。

足够的理论

更改UIElement会丢弃TabItems,从而导致不会绘制装饰器。 2修复:

\由DRapp提出的手动方式:

AdornerLayer

当然,如果在<XAML for MyView1> <AdornerDecorator> ... </AdornerDecorator> </close XAML for MyView1> AdornerLayer之间(在可视化树中)有另一个容器实现AdornerDecorator,那么这将没有任何好处。因此,显式TextBox必须是包裹AdornerDecorator的最后一个。{/ p>

TextBox

\第二个解决方案(我更喜欢)每次<XAML for MyView1> <Grid> ... <GroupBox> <AdornerDecorator> <Grid> ... <TextBox ... /> </Grid> </AdornerDecorator> </GroupBox> </Grid> </close XAML for MyView1> 变为可见时重置ErrorTemplate。这样做可以发现并修复TextBox的缺失。

AdornerLayer

答案 1 :(得分:2)

我在WPF上看到了一些奇怪的东西,并会提供这个建议。根据您引用并尝试在此处应用的其他帖子,使用装饰器装饰器包装您的视图,将装饰器的包装直接移动到您的&#34; MvView1&#34; XAML页面。

从您现有的......

<AdornerDecorator>
   <vw:MyView1 DataContext="{Binding}"/>
</AdornerDecorator>

改为......

<vw:MyView1 DataContext="{Binding}"/>

并在

<XAML for MyView1>
   <AdornerDecorator>
      [wrapping is within the view... then the rest of the view...]
   </AdornerDecorator>
</close XAML for MyView1>

我注意到类似的应用,例如应用控件的可见性,除非某些事物在一个层面上起作用,否则它们不会起作用。但是从来没有找到确切的模式。