Получение GridView для выбора строки при нажатии (а не просто при нажатии на текст)

Мы хотим выделить строку щелчком мыши в любом месте этой строки. В настоящее время пользователь должен щелкнуть текст в строке, чтобы выбрать строку.

Это наш ListView внутри Grid с 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)?

Спасибо!


person Tomas    schedule 03.08.2010    source источник
comment
Вы нашли решение?   -  person Cilvic    schedule 20.04.2011
comment
Извините, я этого не сделал. В нашем продукте все еще есть эта ошибка.   -  person Tomas    schedule 13.05.2011


Ответы (2)


Я подозреваю, что вы не получите ответа, потому что никто не может повторить проблему. Фактически, используя только введенный вами код, вы можете щелкнуть в любом месте сетки, и элемент будет выбран.

Я предполагаю, что кто-то из вашей команды создал шаблон 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... >

Теперь щелчок работает, и наведение тоже.

Надеюсь, это поможет. Это сводило нас с ума, пока мы не подумали об этом.

person Nigel Shaw    schedule 09.09.2012

Дополнение к ответу Найджела Шоуса, которое привело к ответу на этот вопрос для меня.

Не нужно ставить Rectangle на весь Template. Это заблокирует любые элементы управления, которые могут быть в вашей строке. Вместо этого вы можете просто использовать Rectangle позади вашего GridViewRowPresenter. Просто убедитесь, что свойство Fill для Rectangle установлено.

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="ListViewItem">
            <Grid>
                <Rectangle x:Name="ItemBackground" Fill="White" Opacity="0"/>
                <GridViewRowPresenter/>
            </Grid>
        < etc... >
person Marko van der Weide    schedule 07.04.2016