具有多个ItemTemplateSelector的ItemsControl

时间:2017-05-16 13:28:15

标签: wpf triggers contenttemplate contenttemplateselector

我有这个ScrollViewer:

<ScrollViewer x:Name="myScrollViewer">
  <ItemsControl x:Name="myItemsControl" ItemTemplateSelector="{DynamicResource myItemtemplateSelector}" ItemsPanel="{StaticResource myItemsPanel}" />
</ScrollViewer>

我用ItemsControl填充一个有一个布尔参数的类。如果这是真的,我想打电话给ItemTemplateSelector;还有另一个在虚假案件中。

我尝试过这样的事情:

<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>

这是正确的方法吗?

1 个答案:

答案 0 :(得分:3)

嗯,不,这条线错了:

<Setter Property="ContentTemplate" Value="{DynamicResource SubdisciplineDataTemplateSelector}" />

您正在尝试将DataTemplateSelector分配给DataTemplate媒体资源。

现在,有很多方法可以达到你想要的效果。我会创建第三个TemplateSelector,将前两个嵌入为私有属性。

假装你的课程是这样的:

public class MyClass { public bool MyBoolean { get; set; } }

TemplateSelector将是这样的:

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);
    }
}

如果你想/必须保留前两个选择器。如果你可以删除它们,删除它们并将所有逻辑带到新的逻辑。

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