0

我已经搜索了很多,似乎无法破解这个坚果。

我有一个主视图动态变化的应用程序,为此我使用内容演示器与控件绑定:

    <ScrollViewer Grid.Column="2" x:Name="StepScrollViewer">
        <StackPanel Margin="20,20,20,500">
            <ContentPresenter Content="{Binding MainControl}"/>
        </StackPanel>
    </ScrollViewer>

然后我在运行时在我的视图模型中更改 MainControl。问题是被绑定的控件不能可靠地显示它们的错误模板......我怀疑这是由于这里讨论的原因:

验证错误模板未显示数据错误

但是这个问题的修复似乎对我不起作用,因为我没有在我的内容演示者周围使用控制模板。当我将 AdornmentDecorator 标签包裹在我的内容演示者周围时,它似乎并没有解决问题。如果我在加载到 contentpresenter(作为根元素)的每个控件中放置一个 AdornmentDecorator,它确实有效,但如果可能的话,我想避免这种重复。

有什么见解吗?

更新

我尝试了丹尼斯建议的这种方法,但无济于事。控件绑定没问题,但它的效果并不比当前方法好(也显示在下面的注释中)。注意:我尝试使用 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>
    -->
4

1 回答 1

1

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

然后您可以覆盖模板以AdornerDecoratorContentControl. 这与您之前尝试的不同,因为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包装容器的需要,而不仅仅是并排坐着。

于 2014-03-04T01:34:46.027 回答