代码之家  ›  专栏  ›  技术社区  ›  Tomas

获取GridView以在单击时选择行(而不仅仅是单击文本)

  •  4
  • Tomas  · 技术社区  · 14 年前

    这是网格中的ListView,其中包含一个GridView:

    <ListView  Grid.Row="1"
               x:Name="lvUsers"
               PreviewMouseDoubleClick="lvUsers_PreviewMouseDoubleClick"
               IsSynchronizedWithCurrentItem="True"
               ItemsSource="{Binding AllUsers,Mode=TwoWay}"
               ScrollViewer.VerticalScrollBarVisibility="Auto"
               ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Username"
                                    Width="150"
                                    DisplayMemberBinding="{Binding UserDTO.Name}" />
                    <GridViewColumn Header="Fullname"
                                    Width="150"
                                    DisplayMemberBinding="{Binding UserDTO.FullName}" />
                    <GridViewColumn Header="Roles"
                                    Width="250"
                                    DisplayMemberBinding="{Binding Roles}" />
                    <GridViewColumn Header="Default station"
                                    Width="200" DisplayMemberBinding="{Binding UserDTO.DefaultStation.StationName}"/>
                </GridView>
            </ListView.View>
        </ListView>
    

    当用户单击行中的任意位置(甚至在全名和角色之间的空白处)时,我们如何让它选择行?

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  4
  •   Nigel Shaw    12 年前

    我怀疑你得不到答案,因为没有人能重复这个问题。事实上,只要使用您提供的代码,您就可以单击网格中的任意位置,并且该项将被选中。

    我猜您的团队中有人以您可能知道或不知道的样式模板化了ListViewItem。如果使用ListViewItem模板,则可以看到所讨论的问题。

    如果运行下面的代码,您将看到问题:

    <Grid>
            <ListView  Grid.Row="1"
               x:Name="lvUsers"
               IsSynchronizedWithCurrentItem="True"
               ItemsSource="{Binding AllUsers,Mode=TwoWay}"
               ScrollViewer.VerticalScrollBarVisibility="Auto"
               ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
                <ListView.ItemContainerStyle>
                    <Style TargetType="ListViewItem">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="ListViewItem">
                                    <Grid>
                                        <Rectangle x:Name="ItemBackground" Fill="{x:Null}"/>
                                        <GridViewRowPresenter/>
                                    </Grid>
                                    <ControlTemplate.Triggers>
                                        <Trigger Property="IsMouseOver" Value="True">
                                            <Setter TargetName="ItemBackground" Property="Fill" Value="LightGray" />
                                        </Trigger>
                                        <Trigger Property="IsSelected" Value="True">
                                            <Setter TargetName="ItemBackground" Property="Fill" Value="Gray" />
                                            <Setter TargetName="ItemBackground" Property="StrokeDashArray" Value="1 1 1"/>
                                            <Setter TargetName="ItemBackground" Property="Stroke" Value="DarkGray"/>
                                            <Setter TargetName="ItemBackground" Property="StrokeThickness" Value="1"/>
                                            <Setter TargetName="ItemBackground" Property="RenderOptions.EdgeMode" Value="Aliased"/>
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListView.ItemContainerStyle>
                <ListView.Items>
                    <ListViewItem Content="Test Item 1"></ListViewItem>
                    <ListViewItem Content="Test Item 2"></ListViewItem>
                    <ListViewItem Content="Test Item 3"></ListViewItem>
                    <ListViewItem Content="Test Item 4"></ListViewItem>
                </ListView.Items>
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="150" DisplayMemberBinding="{Binding}"/>
                        <GridViewColumn Width="150" DisplayMemberBinding="{Binding}"/>
                        <GridViewColumn Width="150" DisplayMemberBinding="{Binding}"/>
                    </GridView>
                </ListView.View>
            </ListView>
        </Grid>
    

    解决方案是在整个项目模板上添加透明度为0的矩形,如下所示:

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListViewItem">
                <Grid>
                    <Rectangle x:Name="ItemBackground" Fill="{x:Null}"/>
                    <GridViewRowPresenter/>
                    **<Rectangle Fill="White" Opacity="0"></Rectangle>**
                </Grid>
            < etc... >
    

    现在单击可以工作,悬停也可以。

        2
  •  0
  •   Breeze    8 年前

    附录奈杰尔肖的答案,这导致了对这个问题的回答我。

    你不需要把 Rectangle 在整个 Template . 这将阻止您所在行中的任何控件。相反,您可以简单地使用 矩形 在你的背后 GridViewRowPresenter Fill 财产 矩形 已设置。

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListViewItem">
                <Grid>
                    <Rectangle x:Name="ItemBackground" Fill="White" Opacity="0"/>
                    <GridViewRowPresenter/>
                </Grid>
            < etc... >