TemplateBinding не работает с объектами платформы .NET

Я новичок в использовании ControlTemplate. Я пишу свой первый контроль, но у меня (как мне кажется) очень странная проблема.

Любые свойства зависимостей, которые я заставляю TemplateBinding работать, но любые свойства из объектов .NET framework, т. е. свойство Content объекта ContentControl или свойство Items объекта ItemsControl, не заполняются во время выполнения.

Я уверен, что я что-то упускаю... Что именно, я не знаю...

Пример кода ниже:

На данный момент класс очень простой:

public class Title : ContentControl
{
}

И шаблон:

<Style TargetType="{x:Type UI:Title}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type UI:Title}">
                <TextBlock Text="{TemplateBinding Content}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Базовый класс ContentControl — это класс .NET, расположенный в пространстве имен System.Windows.Controls.Control.

Спасибо,

Адам


person Adam    schedule 21.08.2009    source источник
comment
Не могли бы вы добавить фрагмент кода, чтобы показать, что не работает?   -  person Bubblewrap    schedule 21.08.2009
comment
Извини за это. Я добавил один сейчас. Спасибо.   -  person Adam    schedule 21.08.2009


Ответы (2)


Я считаю, что если вы хотите переопределить, где Контент размещен, вы можете сделать это, используя ContentPresenter.

<Style TargetType="{x:Type UI:Title}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type UI:Title}">
                <Label>
                    <ContentPresenter />
                </Label>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Примечание. Я также заменил TextBlock на Label, так как считаю, что TextBlock. Свойство Text не будет принимать все из ContentControl.Content . Вот пример, который я собрал, который работает по назначению:

<Window x:Class="ContentControlTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ContentControlTest"
        Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <Style TargetType="{x:Type local:Title}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:Title}">
                        <Button>
                            <ContentPresenter />
                        </Button>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <local:Title>
        <TextBlock Text="Happy Days!" />
    </local:Title>
</Window>
person user7116    schedule 21.08.2009
comment
Я только что попробовал ваше предложение. Кажется, это не работает... Я провел немного больше исследований, и кажется, что независимо от того, когда я устанавливаю свойство, оно не отображается, но если я помещаю значение в конструктор класса Title, присваивая значение Свойство Content затем отображается... - person Adam; 21.08.2009
comment
Любые идеи? Спасибо за ваш отзыв. - person Adam; 21.08.2009
comment
Разве это не нарушает правила создания собственных элементов управления? Насколько я понимаю, мне не нужно размещать какие-либо элементы управления в моем окне, поскольку стиль, определенный в General.xaml, справится с этим. Я хочу привязать TemplateBind к свойству Content моего класса Title, поэтому всякий раз, когда это свойство изменяется, оно будет обновляться в моем пользовательском интерфейсе. Еще раз спасибо за ваш отзыв. - person Adam; 21.08.2009
comment
Итак, что вы действительно хотите, так это привязать содержимое элемента управления заголовком к некоторому текстовому значению? TemplateBinding — это не то, что вам нужно в этом случае. - person user7116; 21.08.2009
comment
В качестве примечания вы ДОЛЖНЫ размещать элементы управления в окне. Я не совсем понимаю, что вы имели в виду под нарушением правил. Стили используются для создания или изменения визуального представления элемента. - person user7116; 21.08.2009
comment
В порядке. Мне придется уйти и еще немного почитать об этом. Спасибо за вашу помощь. Я вернусь, когда пойму, о чем идет речь :) - person Adam; 22.08.2009
comment
Прошло некоторое время, и я делаю уборку. Да, ты прав. Привязка шаблона - это не то, что я ищу в этом случае. Поскольку это элемент управления содержимым, я могу использовать средство представления содержимого для отображения значения свойств содержимого, как показано в вашем примере кода. Спасибо за вашу помощь. - person Adam; 05.08.2010

Вам может потребоваться реализовать интерфейс INotifyPropertyChanged для ваших объектов и INotifyCollectionChanged для ваших коллекций.

person automatic    schedule 21.08.2009