ListViewItem自定义模板:ContentPresenter保持空白

8
我在代码中有以下ListView。views:GameCard是自定义的UserControl,而{Binding}是一个有效的DataContext对象,并且其中包含三个项。没有自定义的ItemContainerStyle时,一切都完美地工作——列表显示了三个具有正确信息的GameCards等。但是当我添加ItemContainerStyle部分时,我只得到了三个“ABCD”,因此数据仍然被正确加载,但我的UserControl不再显示(我只添加了“ABCD”以检查数据是否存在,否则我得到的只是空框)。
我找到的所有信息似乎都表明,在模板中只需要放置一个ContentPresenter元素即可运行,但在这种情况下似乎并不起作用。我错过了什么吗?
<ListView Grid.Row="1" ItemsSource="{Binding}" BorderThickness="0,0,1,0"
              ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListView.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#FF614B4B" Offset="0"/>
            <GradientStop Color="#FFDA7070" Offset="1"/>
        </LinearGradientBrush>
    </ListView.Background>
  <ListView.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel />
    </ItemsPanelTemplate>
  </ListView.ItemsPanel>
  <ListView.ItemTemplate>
    <DataTemplate>
      <views:GameCard />
    </DataTemplate>
  </ListView.ItemTemplate>
  <ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate>
            <Grid>
              <TextBlock Text="ABCD" />
              <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
            </Grid>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </ListView.ItemContainerStyle>
</ListView>

尝试 <ContentPresenter Content="{Binding}"... - Sten Petrov
3个回答

13

您需要设置ControlTemplate的TargetType。为了使ItemTemplate正常工作,您还需要绑定Content和ContentTemplate属性。

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListViewItem">
                    <Grid>
                        ....
                        <ContentPresenter
                            Content="{TemplateBinding Content}"
                            ContentTemplate="{TemplateBinding ContentTemplate}"
                            ... />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ListView.ItemContainerStyle>

我刚刚在阅读你的回答前5秒钟才发现。不管怎样,还是谢谢! :) 然而,似乎并不需要绑定,它可以在没有绑定的情况下工作。 - Modus Operandi
1
这个可行,但是它丧失了选中项目的蓝色选择矩形……有什么方法可以保留这个吗? - Factor Mystic
@FactorMystic 选择矩形必须是ListViewItem ControlTemplate的一部分(例如,作为Grid的另一个子元素)。您可以查看默认的ListViewItem样式以了解其外观。 - Clemens

1
这可能不适用于您,但到目前为止,我还没有必须修改ItemContainerStyle,只是ListView.View。由于您在模板样式中放置了一个网格,我假设您正在寻找GridView,以下是如何实现:
<ListView.View>
    <GridView>
        <GridViewColumn Width="120">
            <GridViewColumnHeader Height="14" >
                <TextBlock Text="Type" FontSize="9"/>
            </GridViewColumnHeader>
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock  Text="{Binding Path=Name, FallbackValue=MISSING}" /> 
    <!-- or content presenter with bindings here -->
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
...

0

你的样式和一切都很好。所需的是将Content属性分配或绑定到您的ContentPresenter。希望这会有所帮助。


1
而且 ControlTemplate 需要一个 TargetType - Clemens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接