首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保ContentPresenter内的AdornmentDecorator,但不使用ControlTemplate

确保ContentPresenter内的AdornmentDecorator,但不使用ControlTemplate
EN

Stack Overflow用户
提问于 2014-03-04 08:58:23
回答 1查看 548关注 0票数 0

我已经找了很久,但似乎无法破解这个难题。

我有一个应用程序,它的主视图是动态变化的,为此,我使用content presenter并绑定到一个控件:

代码语言:javascript
复制
    <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标记包装我的内容呈现器时,似乎没有解决这个问题。如果我在加载到contentpresenter (作为根元素)的每个控件中都放入一个AdornmentDecorator,它确实可以工作,但如果可能的话,我希望避免这种重复。

有什么见解吗?

更新

我尝试了丹尼斯建议的这种方法,但没有用。控件绑定得很好,但它的效果并不比当前的方法好(如下所示)。注意:我尝试了将AdornerDecorator作为单例元素,就像丹尼斯那样,并围绕着ContentPresenter,如下所示。两者都没有显示出任何区别-当MainControl绑定发生变化时,我的控件周围的装饰器都消失了。

代码语言:javascript
复制
<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>
    -->
EN

回答 1

Stack Overflow用户

发布于 2014-03-04 09:34:46

我不会直接使用ContentPresenter,而是使用ContentControlContentControl是包含其他元素并具有Content属性的控件的基类,例如Button

然后,您可以覆盖该模板,使ContentControl旁边有一个AdornerDecorator。这与您以前尝试的不同,因为现在ContentPresenterAdorner属于相同的可视化树。

代码语言:javascript
复制
<Style TargetType="{x:Type ContentControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ContentControl}">
                <AdornerDecorator>
                    <ContentPresenter/>
                </AdornerDecorator>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22160809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档