首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多重ItemsControl的ItemTemplateSelector

具有多重ItemsControl的ItemTemplateSelector
EN

Stack Overflow用户
提问于 2017-05-16 13:28:14
回答 1查看 1.6K关注 0票数 2

我有一个ScrollViewer:

代码语言:javascript
复制
<ScrollViewer x:Name="myScrollViewer">
  <ItemsControl x:Name="myItemsControl" ItemTemplateSelector="{DynamicResource myItemtemplateSelector}" ItemsPanel="{StaticResource myItemsPanel}" />
</ScrollViewer>

我用一个包含一个布尔参数的类填充ItemsControl。当它是真的,我想调用一个ItemTemplateSelector;另一个在错误的情况下调用。

我在尝试这样的方法:

代码语言:javascript
复制
<ItemsControl x:Name="myItemsControl" ItemsPanel="{StaticResource myItemsPanel}">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <ContentControl>
        <ContentControl.Style>
          <Style TargetType="{x:Type ContentControl}">
            <Style.Triggers>
              <DataTrigger Binding="{Binding Path=myBoolean}" Value="False">
                <Setter Property="ContentTemplate" Value="{DynamicResource SubdisciplineDataTemplateSelector}" />
              </DataTrigger>
              <DataTrigger Binding="{Binding Path=myBoolean}" Value="True">
                <Setter Property="ContentTemplate" Value="{DynamicResource SubdisciplineDataTemplateSelector2}" />
              </DataTrigger>
            </Style.Triggers>
          </Style>
        </ContentControl.Style>
      </ContentControl>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

这条路对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-16 14:45:55

不,这句话错了:

代码语言:javascript
复制
<Setter Property="ContentTemplate" Value="{DynamicResource SubdisciplineDataTemplateSelector}" />

您正在尝试将一个DataTemplateSelector分配给DataTemplate属性。

现在,可以有很多方法来实现你想要的。我将创建第三个TemplateSelector,将前两个作为私有属性嵌入。

假装你的课是这样的:

代码语言:javascript
复制
public class MyClass { public bool MyBoolean { get; set; } }

TemplateSelector应该是这样的:

代码语言:javascript
复制
public class ThirdSelector : DataTemplateSelector
{
    private DataTemplateSelector _selector1 = new SubdisciplineDataTemplateSelector();
    private DataTemplateSelector _selector2 = new SubdisciplineDataTemplateSelector2();

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var obj = item as MyClass;

        if (obj == null)
            return null;

        if (obj.MyBoolean)
            return _selector1.SelectTemplate(item, container);
        else
            return _selector2.SelectTemplate(item, container);
    }
}

这是为了防止需要/必须保留前两个选择器。如果你能摆脱它们,删除它们并将所有的逻辑带到新的逻辑中。

这是一个通用的解决方案,也许如果您共享更多的代码和域对象,可能会有一个更适合您的情况。

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

https://stackoverflow.com/questions/44002867

复制
相关文章

相似问题

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