【问题标题】:ItemsControl with multiple ItemTemplateSelector具有多个 ItemTemplateSelector 的 ItemsControl
【发布时间】:2017-10-15 14:50:30
【问题描述】:

我有这个 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>

这是正确的方法吗?

【问题讨论】:

  • 我可以试试&lt;Setter TargetName="myItemsControl" Property="ContentTemplate" ...。但实际上,我只是将这两个项目模板选择器合并为一个,除了其他任何内容之外,它还可以查看 myBoolean 的值。当然,我也会使用 .NET 命名约定。如果您要重用这两个 itemtemplate 选择器并且希望将它们区分开来,那么有许多简单的方法可以重用 C# 中的代码,而无需任何 XAML 操作。

标签: wpf triggers contenttemplate contenttemplateselector


【解决方案1】:

嗯,不,这行是错误的:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2011-07-25
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多