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

时间:2013-01-14 17:12:04

标签: wpf xaml templates listviewitem contentpresenter

我的代码中有以下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>

3 个答案:

答案 0 :(得分:9)

您需要设置ControlTemplate的TargetType。为了使您的ItemTemplate工作,您还需要绑定ContentContentTemplate属性。

<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>

答案 1 :(得分:0)

这可能不是你的情况,但到目前为止我还没有修改ItemContainerStyle,只是ListView.View。由于你在模板样式中放置了一个Grid,我假设你正在寻找一个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>
...

答案 2 :(得分:0)

你的风格,一切都很好。所需要的只是将内容属性分配或绑定到你的ContentPresenter。我希望这会有所帮助。