带有WrapPanel的ListBox - 删除项目/箭头键导航

时间:2014-06-16 09:54:17

标签: wpf listbox navigation wrappanel arrow-keys

关于我的listbox / wrappanel箭头导航,我有一个奇怪的问题。

我的列表框:

<ListBox x:Name="List" 
     IsSynchronizedWithCurrentItem="True"
     SelectedIndex="{Binding MainIndex, Mode=OneWayToSource}"
     SelectedItem="{Binding CurrentFeed, Mode=TwoWay}"
     ItemsSource="{Binding CurrentFeedList}" 
     ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <WrapPanel IsItemsHost="True" MaxWidth="{Binding ActualWidth, ElementName=Panel}" />
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Width="168">
            <Border BorderBrush="White" BorderThickness="0" Margin="0,7,0,0">
                <Image Source="{Binding Image , Converter={StaticResource ByteArraytoImageSource}}" Width="150" Height="213" ></Image>
            </Border>
            <Border BorderBrush="White" BorderThickness="0"  Height="65" HorizontalAlignment="Center" >
                <TextBlock VerticalAlignment="Center" TextWrapping="Wrap"  FontFamily="{StaticResource DefaultFontFamily}" FontSize="15" Text="{Binding Title}" Foreground="White" Cursor="Hand" HorizontalAlignment="Center"  TextAlignment="Center"/>
            </Border>
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

渲染: Render of Listbox http://muby53.free.fr/render.png

渲染很棒没问题! ;)

正如您所看到的,它是从RSS中检索到的壁纸列表。

我绑定了一个快捷方式,使一个项目重新加入,然后将其从ObservableCollection中删除:

<UserControl.InputBindings>
    <KeyBinding Key="D" Modifiers="Control" Command="{Binding ReadCmd}" />
</UserControl.InputBindings>

在我的视图模型中:

ObservableCollection<Feed> CurrentFeedList { get; set; }
private Feed _currentFeed;
public Feed CurrentFeed
{
    get { return _currentFeed; }
    set
    {
        _currentFeed = value;
        OnPropertyChanged("CurrentFeed");
    }
}
public ICommand ReadCmd { get; set; }
public int MainIndex { get; set; }

我的ReadCmd是一个调用“ReadAction”方法的RelayCommand。

一开始我只是从ObservableCollection中删除该项,但我想两次输入Ctrl + D来读取2项。

所以我决定获取列表框的索引,并在删除一个索引后选择相同的索引。

private void ReadAction()
{
    int previousIndex = MainIndex;

    if (previousIndex == CurrentFeedList.Count - 1)
        previousIndex -= 1;

    CurrentFeedList.Remove(CurrentFeed);

    CurrentFeed = CurrentFeedList[previousIndex];
}

这是我想要的工作,但仍有一个问题,我无法解决。

当我按下Ctrl + D时,SelectedItem将被删除,下一个项目将被选中。但是当我使用箭头键导航在列表上导航时,它每次都会跳转到列表的第一项。

我希望它足够清楚。

谢谢你。

1 个答案:

答案 0 :(得分:0)

此问题是由于当您使用KeyBinding删除项目时,ListBox会失去焦点,因此在按下箭头键后会将焦点放在{{1}的第一项上1}}。

因此,为了使您的箭头键能够从所选项目开始工作,您还必须将焦点设置为ListBox的选定项目。

有几种方法可以做到这一点,例如使用附加行为将焦点设置在Listbox上。最简单的方法是捕获ListBox的ListBoxItem事件,并在处理程序中设置焦点,如下所示:

SelectionChanged