Привязка ItemTemplateSelector к шаблонному родительскому свойству
У меня есть какой-то сторонний элемент управления, и я устанавливаю свойство Template для этого элемента управления. Я делаю следующее внутри ControlTemplate:
<ItemsControl ItemTemplate="{TemplateBinding ItemTemplate}"
ItemsSource="{Binding Path=Items, RelativeSource={RelativeSource TemplatedParent}}" />
Это работает хорошо. Теперь, что мне нужно сделать, это применить 1 дополнительный шаблон в конкретном случае. Это означает, что мне нужно использовать ItemTemplateSelector, где я бы определил два шаблона.
Прежде всего, я хотел бы иметь точно такое же поведение при использовании ItemTemplateSelector, как и с ItemTemplate (как в приведенном выше коде).
<local:SomeTemplateSelector x:key="a"
DefaultTemplate="{what here}" />
иметь эквивалент этой строке:
ItemTemplate="{TemplateBinding ItemTemplate}"
Изменить: вот более подробный пример использования:
<SomeControl>
<SomeControl.Template>
<ControlTemplate TargetType="SomeControl">
<SomeItemsControl ItemTemplate="{TemplateBinding ItemTemplate}"
ItemsSource="{Binding Path=Items, RelativeSource={RelativeSource TemplatedParent}}">
<SomeItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True" />
</ItemsPanelTemplate>
</SomeItemsControl.ItemsPanel>
</SomeItemsControl>
</ControlTemplate>
</SomeControl.Template>
</SomeControl>
1 ответ
Статический ресурс с ключом x: который является вашим шаблоном по умолчанию, предполагая, что TemplateSelector
инвентарь DataTemplateSelector
и имеет PropertyCalled DefaultTemplate
,
- когда выбран шаблон по умолчанию?
это то, что вы решаете в своем SelectTemplate(object item, DependencyObject container)
метод вашего TemplateSelector.
вот пример:
public class MainViewModel
{
public ObservableCollection<VMBase> Items { get; set; } = new ObservableCollection<VMBase>() { new Model1(), new Model2(), new Model3() };
}
public class SomeTemplateSelector : DataTemplateSelector
{
public DataTemplate Template1 { get; set; }
public DataTemplate Template2 { get; set; }
public DataTemplate DefaultTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is Model1)
return Template1;
else if (item is Model2)
return Template2;
else
return DefaultTemplate; //or return null if you need the default template of the control
}
}
public class VMBase{}
public class Model1 : VMBase{}
public class Model2 : VMBase{}
public class Model3 : VMBase{}
XAML:
<Window.Resources>
<DataTemplate x:Key="defaultTemplate">
<TextBlock>defaultTemplate</TextBlock>
</DataTemplate>
<DataTemplate x:Key="Template1">
<TextBlock>Template1</TextBlock>
</DataTemplate>
<DataTemplate x:Key="Template2">
<TextBlock>Template2</TextBlock>
</DataTemplate>
<local:SomeTemplateSelector x:Key="SomeTemplateSelector" DefaultTemplate="{StaticResource defaultTemplate}"
Template1="{StaticResource Template1}"
Template2="{StaticResource Template2}">
</local:SomeTemplateSelector>
</Window.Resources>
<ListBox ItemsSource="{Binding Items}" ItemTemplateSelector="{StaticResource SomeTemplateSelector}"></ListBox>
если вы хотите, чтобы шаблон по умолчанию для данного элемента был применен, просто верните null из метода SelectTemplate.