2010-08-03 64 views
4

我们想要在该行的任何地方的鼠标点击中选择一行。目前,用户必须单击行中的文本才能选择行。获取GridView以在点击时选择行(不仅仅是单击文本)

这是我们的一个网格内的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> 

我们怎样才能得到它,当用户的行(甚至在之间的空间中点击任意位置选择该行的发言权FullName和Roles)?

谢谢!

+0

您是否找到解决方案? – Cilvic 2011-04-20 12:52:41

+0

对不起,我没有。我们的产品仍然有这个“bug”。 – Tomas 2011-05-13 19:27:45

回答

3

我怀疑你没有得到答案,因为没有人可以复制问题。只要你提供的代码实际上你可以点击网格中的任何地方,这个项目将被选中。

我在猜测你的团队中的某个人以你可能或可能不知道的风格模板化了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...> 

现在点击作品,悬停为好。

我希望这会有所帮助。直到我们想到它,它才使我们发疯。

0

奈杰尔肖的补充答案,这导致了我对这个问题的答案。

您不需要在整个Template上输入Rectangle。这将阻止您在您的行中可能拥有的任何控件。相反,您可以在GridViewRowPresenter后面简单使用Rectangle。只要确保设置了RectangleFill属性即可。

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