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);
}
}
Это в случае, если вы хотите / должны сохранить первые два селектора. Если вы можете избавиться от них, удалите их и перенесите всю логику в новую.
Это общее решение, возможно, если вы поделитесь большим количеством своего кода и доменных объектов, для вашего случая может быть даже более подходящее.