Строка ListView остается выбранной после выбора новой строки - PullRequest
0 голосов
/ 11 ноября 2011

Следующий код xaml создает ListView с тремя столбцами.ListView ItemsSource является наблюдаемой коллекцией.Первый столбец показывает имя объекта в определенной строке.Во втором и третьем столбцах показаны кнопки, связанные с объектом в определенной строке.

<Grid Width="497" Height="260">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="309*" />
        <ColumnDefinition Width="188*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="478*" />
        <RowDefinition Height="4*" />
    </Grid.RowDefinitions>
    <GroupBox Header="ObservableCollection Object List" HorizontalAlignment="Left" Width="497" BorderBrush="Black" BorderThickness="2" Grid.ColumnSpan="2">
        <ListView ItemsSource="{Binding Path=CollectionList}" Name="QueueListView">
            <ListView.Resources>
                <Style TargetType="{x:Type ListViewItem}">
                    <EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
                </Style>
            </ListView.Resources>
            <ListView.SelectedItem>
                <Binding Path="SelectedObjectFromList" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" >
                </Binding>               
            </ListView.SelectedItem>
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="140" Header="Object Name" DisplayMemberBinding="{Binding Name}" />
                    <GridViewColumn Width="160" Header="Property Information">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="Get Property Info" Command="{Binding Path=GetObjProperties}"
                                        DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}" />                      
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Width="180" Header="Transfer">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="Transfer Object" Command="{Binding Path=TransferObjHere}"
                                        DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </GroupBox>
</Grid>

Обработчик события SelectCurrentItem связывает ListView.SelectedItem со свойством SelectedObjectFromList в моей модели представления, когдапользователь нажимает кнопку «Передать объект» или «Получить информацию о недвижимости».Я использую это свойство для предоставления выбранного объекта моей модели представления.

Вот мой код c # обработчика SelectCurrentItem в коде:

    protected void SelectCurrentItem(Object sender, KeyboardFocusChangedEventArgs e)
    {
        ListViewItem viewItem = (ListViewItem)sender;
        viewItem.IsSelected = true;
    }

Это прекрасно работает!Когда пользователь нажимает кнопку, свойство SelectedObjectFromList обновляется из объекта ListView observablecollection для этой строки.(Нет необходимости вручную щелкать строку ListView, чтобы установить свойство перед нажатием кнопки.)

Одна проблема: при нажатии кнопок в списке недавно выбранные строки по-прежнему отображаются выбранными (они подсвечиваются вGUI).

Я попытался решить проблему, установив свойство isFocused объекта ListView:

    protected void SelectCurrentItem(Object sender, KeyboardFocusChangedEventArgs e)
    {
        ListViewItem Item = (ListViewItem)sender;
        Item.IsSelected = true;
        Item.IsFocused = true;
    }

Конечно, это дает мне исключение StackOverflow :).У кого-нибудь есть пример кода для обновления ListView.Selection в GUI в этом случае?Заранее спасибо.

1 Ответ

2 голосов
/ 11 ноября 2011

ListViews позволяют вам выбрать несколько элементов одновременно. Когда вы щелкаете по второму элементу, вы не сбрасываете свойство IsSelected старого выбранного элемента на False, поэтому оно остается выбранным

Вы можете попробовать либо установить для ListView SelectionMode значение Single

.
<ListView SelectionMode="Single" ... />

или попробуйте получить старый SelectedItem и отменить его выбор при выборе нового

protected void SelectCurrentItem(Object sender, KeyboardFocusChangedEventArgs e)
{
    var temp = myListBox.SelectedItem as ListViewItem;
    if (temp != null)
        temp.IsSelected = false;

    ListViewItem viewItem = (ListViewItem)sender;
    viewItem.IsSelected = true;
}
...