我有两个列表框,默认和自定义。一个正确使用DataTemplateSelector,而另一个只使用默认的DataTemplates从不调用选择器;
//shows correctly
<ListBox Name="testlb" ItemTemplateSelector="{StaticResource ffDataTemplateSelector}"/>
//now showing correctly (using default DataTemplates instead of selector)
<local:FFBox x:Name="myFFBox" ItemTemplateSelector="{StaticResource ffDataTemplateSelector}" ItemContainerStyle="{StaticResource FFItemStyle}" />
两者都有相同的来源
testlb.ItemsSource = CollectionViewSource.GetDefaultView(FileCollectionView);
myFFBox.ItemsSource = CollectionViewSource.GetDefaultView(FileCollectionView);
显然,DataTemplateSelector没有任何问题,因为它在testlb上正常工作
问题是ItemContainerStyle="{StaticResource FFItemStyle}"
我用它来定义每个ListBoxItem的整体外观,包含触发器,动画等。如果它存在,则选择器不起作用。
<Style x:Key="FFItemStyle" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Grid x:Name="mygrid">
<ContentPresenter x:Name="ContentPresenter"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"/>
如何保留ItemContainerStyle并仍然可以使用DataTemplateSelector更改DataTamplates?
修改 解决了,我们应该保留它,因为这是wpf中那些不合逻辑且没有很好记录的事情之一。
答案 0 :(得分:5)
知道了: 如果定义了ItemContainerStyle,则需要在ContentPresenter中使用ContentTemplateSelector而不是ItemTemplateSelector。
<ContentPresenter x:Name="ContentPresenter" Content="{TemplateBinding Content}"
ContentTemplateSelector="{StaticResource ffDataTemplateSelector}"
答案 1 :(得分:0)
mmm代码看起来没问题,但您是否尝试过像这样设置ItemTemplateSelector
Generic.xaml中的
<Setter Property="ItemTemplateSelector">
<Setter.Value>
<helpers:ffDataTemplateSelector x:Name="ffDataTemplateSelector" />
</Setter.Value>
</Setter>
在Generic.xaml
的顶部设置助手xmlns:helpers="using:[Namespace where ffDataTemplateSelector resides]"