具有多个 ItemTemplateSelector 的 ItemsControl
ItemsControl with multiple ItemTemplateSelector
我有这个 ScrollViewer:
<ScrollViewer x:Name="myScrollViewer">
<ItemsControl x:Name="myItemsControl" ItemTemplateSelector="{DynamicResource myItemtemplateSelector}" ItemsPanel="{StaticResource myItemsPanel}" />
</ScrollViewer>
我用具有一个布尔参数的 class 填充 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>
这是正确的方法吗?
嗯,不对,这行是错误的:
<Setter Property="ContentTemplate" Value="{DynamicResource SubdisciplineDataTemplateSelector}" />
您正在尝试将 DataTemplateSelector
分配给 DataTemplate
属性。
现在,有很多方法可以实现您想要的。我会创建第三个 TemplateSelector
,将前两个作为私有属性嵌入。
假装你的 class 是这样的:
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);
}
}
这是为了防止您 want/must 保留前两个选择器。如果你能摆脱它们,删除它们并将所有逻辑带到新的。
这是一个通用的解决方案,如果您共享更多的代码和域对象,也许会有更适合您的情况的解决方案。
我有这个 ScrollViewer:
<ScrollViewer x:Name="myScrollViewer">
<ItemsControl x:Name="myItemsControl" ItemTemplateSelector="{DynamicResource myItemtemplateSelector}" ItemsPanel="{StaticResource myItemsPanel}" />
</ScrollViewer>
我用具有一个布尔参数的 class 填充 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>
这是正确的方法吗?
嗯,不对,这行是错误的:
<Setter Property="ContentTemplate" Value="{DynamicResource SubdisciplineDataTemplateSelector}" />
您正在尝试将 DataTemplateSelector
分配给 DataTemplate
属性。
现在,有很多方法可以实现您想要的。我会创建第三个 TemplateSelector
,将前两个作为私有属性嵌入。
假装你的 class 是这样的:
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);
}
}
这是为了防止您 want/must 保留前两个选择器。如果你能摆脱它们,删除它们并将所有逻辑带到新的。
这是一个通用的解决方案,如果您共享更多的代码和域对象,也许会有更适合您的情况的解决方案。