Как использовать привязку шаблона внутри шаблона данных в пользовательском элементе управления (Silverlight) - PullRequest
13 голосов
/ 08 января 2011

Я пытаюсь создать элемент управления, который примет ItemsSource и InnerTemplate и покажет все элементы, завернутые в CheckBox es.

Элемент управления имеет 2 свойства зависимости:

public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(CheckBoxWrapperList), null);
public static readonly DependencyProperty InnerTemplateProperty = DependencyProperty.Register("InnerTemplate", typeof(DataTemplate), typeof(CheckBoxWrapperList), null);

и вот шаблон:

<ControlTemplate TargetType="local:CheckBoxWrapperList">
    <Grid>
        <Grid.Resources>
            <DataTemplate x:Key="wrapper">
                <CheckBox>
                    <ContentPresenter ContentTemplate="{TemplateBinding InnerTemplate}" Content="{Binding}" />
                </CheckBox>
            </DataTemplate>
        </Grid.Resources>
        <ItemsControl ItemTemplate="{StaticResource wrapper}" ItemsSource="{TemplateBinding ItemsSource}" />
    </Grid>
</ControlTemplate>

Однако этот подход не работает.
Привязка в ControlPresenter.ContentTemplate с использованием TemplateBinding не работает.
Однако, когдаЯ не использую привязку шаблона и ссылаюсь на шаблон как на статический ресурс, тогда он работает как положено.

  • Почему я не могу использовать привязку шаблона внутри предъявителя контента в шаблоне данных?
  • Что мне здесь не хватает?Требуется ли специальная разметка?
  • Есть ли способ достичь ожидаемого поведения?

Заранее спасибо.

Ответы [ 2 ]

19 голосов
/ 20 марта 2012

Silverlight и WPF

Вы можете обойти это с помощью относительной привязки источника:

Вместо:

{TemplateBinding InnerTemplate}

Вы бы использовали:

{Binding RelativeSource={RelativeSource AncestorType=local:CheckBoxWrapperList}, Path=InnerTemplate}

Это немного запутанно, но работает.

WinRT

WinRT не имеет AncestorType.У меня есть что-то , которое работает, но это ужасно.

Вы можете использовать прикрепленное свойство, чтобы сохранить значение TemplateBinding, а затем получить к нему доступ, используя ElementName ...

<ControlTemplate TargetType="local:CheckBoxWrapperList">
    <Grid x:Name="TemplateGrid" magic:Magic.MagicAttachedProperty="{TemplateBinding InnerTemplate}">
        <Grid.Resources>
            <DataTemplate x:Key="wrapper">
                <CheckBox>
                    <ContentPresenter ContentTemplate="{Binding ElementName=TemplateGrid, Path=(magic:Magic.MagicAttachedProperty)}" Content="{Binding}" />
                </CheckBox>
            </DataTemplate>
        </Grid.Resources>
        <ItemsControl ItemTemplate="{StaticResource wrapper}" ItemsSource="{TemplateBinding ItemsSource}" />
    </Grid>
</ControlTemplate>

Я не знаю, есть ли лучший способ для WinRT.

11 голосов
/ 19 июля 2011

TemplateBinding можно использовать только в ControlTemplate, вы используете его в DataTemplate. (Тот факт, что DataTemplate находится в ControlTemplate, не имеет значения)

...