我有一个非常类似的问题:
Importing .csv with timestamp column (dd.mm.yyyy hh.mm.ss) using psql \copy
Issue with WPF validation(IDataErrorInfo) and tab focusing
Window
在Window
的同一实例中执行操作,但重新加载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
的代码隐藏中重新启动验证,但是没有用。
有什么想法吗?
答案 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>
我注意到类似的应用,例如应用控件的可见性,除非某些事物在一个层面上起作用,否则它们不会起作用。但是从来没有找到确切的模式。