2010-08-03 63 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...> 
相關問題