ItemsControl с несколькими ItemTemplateSelector

У меня есть этот 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 ответ

Решение

Ну нет, эта строка неверна:

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

Это в случае, если вы хотите / должны сохранить первые два селектора. Если вы можете избавиться от них, удалите их и перенесите всю логику в новую.

Это общее решение, возможно, если вы поделитесь большим количеством своего кода и доменных объектов, для вашего случая может быть даже более подходящее.

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