使用gridview为Listview设置样式

时间:2015-07-12 10:26:12

标签: asp.net wpf xaml listview gridview

我尝试设置listview模板的样式,其中包含gridview。我尝试使用ItemsPresenter来做它并且它工作正常,但我的gridview的标题消失了。

我应该用什么来保存我的标题?

<Style TargetType="{x:Type ListView}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListView}">
                    <Border x:Name="Bd"
                            SnapsToDevicePixels="true">
                        <ScrollViewer Focusable="false">
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

编辑:我的列表视图

<ListView Name="findReplaceView" Margin="10" Grid.Row="1" Grid.Column="0" 
                  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
                  SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
                  ItemsSource="{Binding FindAndReplaceItems}">
  <ListView.View>
    <GridView AllowsColumnReorder="False">
      <GridViewColumn Header="Find" DisplayMemberBinding="{Binding Find}"
                                    Width="{Binding ElementName=helperField1, Path=ActualWidth}"/>
      <GridViewColumn Header="Replace" DisplayMemberBinding="{Binding Replace}"
                                    Width="{Binding ElementName=helperField2, Path=ActualWidth}"/>
    </GridView>
  </ListView.View>
</ListView>

1 个答案:

答案 0 :(得分:0)

这是因为你没有设置标题部分的样式。这就是你应该这样做的方式:

<Style TargetType="{x:Type ListView}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Grid HorizontalAlignment="Left">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <!-- This is how your headers are presented -->
                        <ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=ListView},Path=View.Columns}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Border BorderThickness="1" BorderBrush="LightGray" Background="MidnightBlue">
                                        <TextBlock Foreground="WhiteSmoke" 
                                                   TextAlignment="Center"
                                                   FontWeight="Bold" 
                                                   Text="{Binding Header}"
                                                   Width="{Binding ActualWidth}"/>
                                    </Border>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel Orientation="Horizontal"/>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                        </ItemsControl>
                    <!-- This is how your items are presented -->
                    <Border x:Name="Bd" Grid.Row="1"
                    SnapsToDevicePixels="true">
                        <ScrollViewer Focusable="false">
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        </ScrollViewer>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

在上面的代码中有2 Grid.RowDefinitions height="Auto"height="*",第一个是表示标题部分的区域(即顶行),第二个是包含ItemsPresenter的剩余区域,用于确定商品的展示方式。

修改

由于这是ListView的一般风格,因为它的列已在某些ListView.View中定义,我认为使用ItemsControl标题部分会使您的风格相当灵活。我相应地修改了我的代码示例,其中标题部分是ItemsControl,其水平方向是ItemsSource绑定到ListView.View.Columns。这样,样式中的列数将取决于ListView中的列数。另外ItemsControl.ItemTemplateTextBlock,它的文本绑定到相应列的标题,因此样式中的列标题将与ListView中的列标题相同。