Вы создаете бесконечное l oop.
UserControl
уже является ContentControl
, как оно происходит из него. Поэтому, пока вы не переопределите его ControlTemplate
, вы не должны добавлять к нему ContentPresenter
, который привязывается к TemplatedParent
при использовании внутри шаблона.
Триггер этого страдания это TemplatedParent
привязка. TestControl
является частью шаблона. Шаблон применяется к ListViewItem
, который поэтому является шаблонным родителем TestControl
.
Теперь значением источника привязки ContentPresenter
внутри TestControl
является значение свойства ListViewItem.Content
, которое содержит сам TestControl
. Таким образом, вы добавляете шаблонного родителя ListViewItem.Content
, который является TestControl
, к ContentPresenter
из TestControl
, который теперь содержит тот же TestControl
(сам по себе), который связывает шаблонного родителя ListViewItem.Content
, который это TestControl
, ContentPresenter
из TestControl
, который теперь содержит тот же TestControl
(сам), который связывает шаблонного родителя ... StackOverflow.
Если вы хотите использовать UserControl
как ContentControl
, т. Е. Для отображения визуальных элементов других «внешних» элементов управления, то используйте его как ContentCobtrol
:
TestControl
<UserControl x:Class="TestControl">
</UserControl>
DataTemplate
<DataTemplate DataType="{x:Type local:TestViewModel}">
<local:TestControl>
<TextBlock Text="{Binding Path=Message, Mode=OneWay}"/>
</local:TestControl>
</DataTemplate>
Или, если контент более сложный и продвинутый, чем простая презентация, вы должны переопределить ControlTemplate
:
TestControl
<UserControl x:Class="TestControl">
<UserControl.Template>
<ControlTemplate TargetType="local:TreeIndex">
<Border>
<Grid>
...
<ContentPresenter Content="{TemplateBinding Content}" />
</Grid>
</Border>
</ControlTemplate>
</UserControl.Template>
</UserControl>
DataTemplate
<DataTemplate DataType="{x:Type local:TestViewModel}">
<local:TestControl>
<TextBlock Text="{Binding Path=Message, Mode=OneWay}"/>
</local:TestControl>
</DataTemplate>