在ContentPresenter中确保AdornmentDecorator,但没有ControlTemplate

时间:2014-03-04 00:58:23

标签: wpf contentpresenter errortemplate

我搜索了很多,似乎无法解决这个问题。

我有一个主视图可以动态更改的应用程序,为此我使用内容展示器绑定到控件:

    <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>
    -->

1 个答案:

答案 0 :(得分:1)

我不是直接使用ContentPresenter,而是使用ContentControlContentControl是包含其他元素且具有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需要包装容器,而不是并排坐着。