10
votes

I have some strange behavior of ListView control in WPF.

We are developing application in C#.

I created ListView with some items and set SelectedIndex to some index in the middle of its list. Then I clicked mouse at any place on the ListView and then navigate with Up/Dows keyboard keys, everything works perfectly. But If I move focus to another control and then tries to set focus back to ListView control programmatically, then I'm getting the problem.

The ListView gets the focus, but when I’m trying to navigate with the keyboard, current selection will be canceled and the first item will be selected and navigation will start from the first item in list.

I'm setting focus to ListView control by calling to its .Focus() method.

It looks like even ListView control in focus, but no items actually in focus, even if SelectedIndex has some valid values.

Please, help me! How can I set focus to ListView control programmatically to prevent such behavior?

i find out that my listview selected index is different from the focused item . who ???

in selectedindex_changed event i set the selected index to the fix item (5) , but when i press arrow keys the item was changed . that mean the selected index is fixed to 5 but the current item(shown with a dot border around it ) moved to the arrow key location . anyway my selecteditem is fix to 5 , but my scrollviews moves to position that current item is .

this code is in listView1_SelectionChanged: listView1.SelectionMode = SelectionMode.Single; listView1.SelectedIndex = 5;

my listview has a modified view :

    <l:PlainView x:Key="tileView"
            ItemTemplate="{StaticResource centralTile}"
            ItemHeight="120" ItemWidth="130" />

i dont know about the problom any more .

regards

1
Isn't calling .Focus() generally a bad practice in any GUI/frameworks/languages ?user215054
Hey did you find a solution for this one? I have the exact same problem and cant figure it out!Mark Pearl
So, how else do you set the focus then?Sam

1 Answers

6
votes

ListView probably suffers from the same issue that ListBox does, in that it can have focus independently of its items.

When I want to focus a ListBox, I need to do something like this:

listBox1.Focus();
if (listBox1.Items.Count > 0)
{
    var index = listBox1.SelectedIndex;
    if (index < 0) index = 0;

    var item = listBox1.ItemsContainerGenerator
                   .ContainerFromIndex(index) as ListBoxItem;
    item.Focus();
}

So this focuses the ListBox, but then if the ListBox contains any items it focuses either the selected item, or the first item if one is selected.

I've never used ListView in WPF, but presumably you could hack together a similar method using ListView instead of ListBox and ListViewItem in place of ListBoxItem.