我搜索了很多,似乎无法解决这个问题。
我有一个主视图可以动态更改的应用程序,为此我使用内容展示器绑定到控件:
<ScrollViewer Grid.Column="2" x:Name="StepScrollViewer">
<StackPanel Margin="20,20,20,500">
<ContentPresenter Content="{Binding MainControl}"/>
</StackPanel>
</ScrollViewer>
然后我在视图模型中在运行时更改MainControl。问题是绑定的控件无法可靠地显示其错误模板...我怀疑这是出于这里讨论的原因:
Validation ErrorTemplate not showing on data errors
但是这个问题的修复似乎对我没有用,因为我没有在我的内容演示者周围使用控件模板。当我在我的内容演示者周围包装AdornmentDecorator标记时,它似乎无法解决问题。如果我将AdornmentDecorator放入我加载到contentpresenter(作为根元素)的每个控件中,它会起作用,但是如果可能的话我想避免这种重复。
任何见解?
更新
我试过丹尼斯提出的这种方法,但无济于事。控件绑定没问题,但它的工作效果并不比当前的方法好(也见下面的评论)。注意:我尝试将AdornerDecorator作为单身元素与Dennis一样,并围绕ContentPresenter,如下所示。两者都没有显示出任何差异 - 当MainControl绑定发生变化时,我的控件周围的装饰器都会消失。
<UserControl.Resources>
<Style x:Key="MainContentControl" TargetType="{x:Type ContentControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ContentControl}">
<Grid>
<AdornerDecorator>
<ContentPresenter Content="{Binding MainControl}"/>
</AdornerDecorator>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid>
.....
<ScrollViewer Grid.Column="2" x:Name="StepScrollViewer">
<StackPanel Margin="20,20,20,500" >
<ContentControl Style="{StaticResource MainContentControl}"/>
</StackPanel>
</ScrollViewer>
<!-- THE BELOW WORKS IF I SURROUND EACH BOUND CONTROL WITH adornerdecorator -->
<ScrollViewer Grid.Column="2" x:Name="StepScrollViewer">
<StackPanel Margin="20,20,20,500">
<ContentPresenter Content="{Binding MainControl}"/>
</StackPanel>
</ScrollViewer>
-->
答案 0 :(得分:1)
我不是直接使用ContentPresenter
,而是使用ContentControl
。 ContentControl
是包含其他元素且具有Content
属性的控件的基类,例如Button
。
然后,您可以覆盖模板,使AdornerDecorator
旁边有ContentControl
。这与您之前尝试的不同,因为ContentPresenter
是与Adorner
相同的可视树的一部分。
<Style TargetType="{x:Type ContentControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ContentControl}">
<AdornerDecorator>
<ContentPresenter/>
</AdornerDecorator>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
编辑:忘记AdornerDecorator
需要包装容器,而不是并排坐着。