Привязка 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.

Другие вопросы по тегам