Как использовать шаблон привязки внутри шаблона данных на пользовательском элементе управления (Silverlight)

StackOverflow https://stackoverflow.com/questions/4635216

Вопрос

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

Упражнение имеет 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 не работает.
Однако, когда я не использую шаблон привязки и ссылаться на шаблон как статический ресурс, то он работает как ожидалось.

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

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

Это было полезно?

Решение

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

Другие советы

Silverlight и WPF.

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

Вместо:

{TemplateBinding InnerTemplate}

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

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

Это немного Месье, но это работает.

Воин

У 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top