ContentControl не показывает контент

У меня есть пользовательский ContentControl, который имеет фиксированный макет XAML, такой как UserControl (вместо обычного применяемого универсального шаблона).

Раньше у этого макета не было лишней разметки, поэтому он был буквально:

<ContentControl x:Class="MyControls.CustomViewControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
</ContentControl>

Это сработало нормально.

Теперь я хочу поместить рамку вокруг содержимого, поэтому я изменил XAML на:

<ContentControl x:Class="MyControls.CustomViewControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <ContentControl.Template>
        <ControlTemplate>
            <Border BorderThickness="5" BorderBrush="LightGreen">
                <ContentPresenter />
            </Border>
        </ControlTemplate>
    </ContentControl.Template>
</ContentControl>

Это показывает границу, но не содержание.

Я попытался указать явную привязку для ContentPresenter:

<ContentPresenter Content="{Binding Path=Content, RelativeSource={RelativeSource Self}}"/>

Но это не имело значения.

Установка явного Content работает:

<ContentPresenter Content="TEST" />

Кто-нибудь знает, почему привязка контента не работает? Думаю, я мог бы вернуться к обычному общему шаблону, но было бы проще, если бы я мог просто сделать это напрямую, как UserControl.


person GazTheDestroyer    schedule 03.10.2012    source источник


Ответы (2)


Используйте TemplateBinding вместо Binding внутри ControlTemplate :

<ContentControl.Template>
    <ControlTemplate TargetType="ContentControl">
        <Border BorderThickness="5" BorderBrush="LightGreen">
            <ContentPresenter Content="{TemplateBinding Content}"/>
        </Border>
    </ControlTemplate>
</ContentControl.Template>

РЕДАКТИРОВАТЬ:

Важной частью показанного фрагмента кода является TargetType в определении ControlTemplate. С типом цели

<ContentControl.Template>
    <ControlTemplate TargetType="ContentControl">
        <Border BorderThickness="5" BorderBrush="LightGreen">
            <ContentPresenter/>
        </Border>
    </ControlTemplate>
</ContentControl.Template>

уже работает без всяких TemplateBinding

person Nicolas Voron    schedule 03.10.2012
comment
Это не сработало, но указало мне правильное направление, так как затем я получил ошибку. Мне нужно было установить TargetType моего шаблона. Когда я это делаю, мне вообще не нужна привязка, поскольку она неявна. Ваше здоровье. - person GazTheDestroyer; 03.10.2012

Добавить TargetType для шаблона элемента управления

<ContentControl.Template>
    <ControlTemplate  TargetType="Button">
        <Border BorderThickness="5" BorderBrush="LightGreen">
            <ContentPresenter />
        </Border>
    </ControlTemplate>
</ContentControl.Template>
person Abdul Saleem    schedule 18.02.2015
comment
Это правильный ответ! В моем случае это Application Style вместо ContentControl. Все такой же. - person Luke Vo; 11.04.2018