Как использовать шаблон привязки внутри шаблона данных на пользовательском элементе управления (Silverlight)
-
08-10-2019 - |
Вопрос
Я пытаюсь создать контроль, который займет 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.