首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ItemTemplateSelector绑定到模板父属性

ItemTemplateSelector绑定到模板父属性
EN

Stack Overflow用户
提问于 2015-04-15 21:03:19
回答 1查看 983关注 0票数 1

我有一些第三方控件,我正在为该控件设置一个模板属性。我在ControlTemplate中执行以下操作:

代码语言:javascript
复制
<ItemsControl ItemTemplate="{TemplateBinding ItemTemplate}"
              ItemsSource="{Binding Path=Items, RelativeSource={RelativeSource TemplatedParent}}" />

这个还行。现在,我需要做的是在特定情况下应用一个额外的模板。这意味着我需要使用ItemTemplateSelector,在这里我将定义两个模板。

首先,我希望使用ItemTemplateSelector的行为与使用ItemTemplate的行为完全相同(如上面的代码所示)。

代码语言:javascript
复制
<local:SomeTemplateSelector x:key="a"
                            DefaultTemplate="{what here}" />

相当于这一行:

代码语言:javascript
复制
ItemTemplate="{TemplateBinding ItemTemplate}"

编辑:下面是一个更详细的用法示例:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2015-04-15 22:41:50

一个具有x:key的静态资源,它是您的默认模板,假设您的TemplateSelector实现了DataTemplateSelector,并且有一个PropertyCalled DefaultTemplate

  • 何时选择默认模板?

这是您在SelectTemplate(object item, DependencyObject container)方法中决定的TemplateSelector。

以下是一个例子:

代码语言:javascript
复制
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:

代码语言:javascript
复制
 <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>

如果您希望应用给定元素的默认模板,则从SelectTemplate方法中只返回null。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29660863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档