Обеспечение AdornmentDecorator в ContentPresenter, но без ControlTemplate

Я искал вокруг довольно много и не могу сломать этот орех.

У меня есть приложение с основным видом, который изменяется динамически, и для этого я использую Content Presenter с привязкой к элементу управления:

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

Затем я изменяю MainControl во время выполнения в моей модели представления. Проблема в том, что привязываемые элементы управления не отображают свои шаблоны ошибок надежно... Я подозреваю, что это происходит по причинам, рассмотренным здесь:

Валидация ErrorTemplate не отображается при ошибках данных

Но решение этой проблемы, кажется, не работает для меня, потому что я не использую шаблон элемента управления вокруг моего предъявителя контента. Когда я оборачиваю тег AdornmentDecorator вокруг моего предъявителя контента, кажется, что это не решает проблему. Это работает, если я помещаю AdornmentDecorator внутри каждого элемента управления, который загружаю в contentpresenter (как корневой элемент), но я бы хотел избежать этого повторения, если это возможно.

Есть идеи?

ОБНОВИТЬ

Я попробовал этот подход, предложенный Денисом, но безрезультатно. Элемент управления связывается хорошо, но он работает не лучше, чем текущий подход (также показан ниже, прокомментированный). Примечание. Я пробовал сделать это как с AdornerDecorator в качестве одноэлементного элемента, как у Денниса, так и вокруг 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 ответ

Вместо использования 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 нужно обернуть контейнер, а не просто сидеть бок о бок.

Другие вопросы по тегам