如果设置了ItemContainerStyle,则DataTemplateSelector不起作用

Dan*_*iel 3 c# wpf xaml listbox

我有两个列表框,默认和自定义.一个正确使用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}" />
Run Code Online (Sandbox Code Playgroud)

两者都有相同的来源

testlb.ItemsSource = CollectionViewSource.GetDefaultView(FileCollectionView);
myFFBox.ItemsSource = CollectionViewSource.GetDefaultView(FileCollectionView);
Run Code Online (Sandbox Code Playgroud)

显然,DataTemplateSelector没有任何问题,因为它在testlb上正常工作

问题是ItemContainerStyle="{StaticResource FFItemStyle}"我用来定义每个ListBoxItem的整体外观,包含触发器,动画等.如果它存在,则Selector不起作用.

<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}"/>
Run Code Online (Sandbox Code Playgroud)

如何保留ItemContainerStyle并仍然可以使用DataTemplateSelector更改DataTamplates?

编辑: 解决了,我们应该保留它,因为这是wpf中那些不合逻辑且没有很好记录的事情之一.

Dan*_*iel 5

得到它:如果你定义了ItemContainerStyle,而不是ItemTemplateSelector,则需要在ContentPresenter中使用ContentTemplateSelector和DataTemplateSelector.

<ContentPresenter x:Name="ContentPresenter"  Content="{TemplateBinding  Content}"
               ContentTemplateSelector="{StaticResource ffDataTemplateSelector}"
Run Code Online (Sandbox Code Playgroud)