Обеспечение 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
нужно обернуть контейнер, а не просто сидеть бок о бок.