如何同步列表框的SelectedItem和WPF关注项目?(How to Synchronize L

2019-10-20 16:17发布

我创建按钮的列表框项目。 使用键盘快捷键,所选择的项目/按钮将被变化到按钮其中第一个字符与所按下的键相同。 问题是所关注项(虚线矩形)将不与所选项目同步。 如果我们使用键盘上的箭头这个问题不存在。 短路的代码是:

        <ListBox x:Name="ListBoxRef" 
             ScrollViewer.HorizontalScrollBarVisibility="Disabled"
             DataContext="{Binding Path=ListViewSource}" IsSynchronizedWithCurrentItem="True"
             ItemsSource="{Binding}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Tag="{Binding}" IsTabStop="False"
                        Command="{Binding ElementName=UserControlTypeSelectionView, Path=DataContext.SelectCommand}"
                        CommandParameter="{Binding RelativeSource={RelativeSource Self}}">
                    <Button.Template>
                        <ControlTemplate>
                            <TextBlock Text="{Binding Path=Name}" />
                        </ControlTemplate>
                    </Button.Template>
                </Button>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ListBox>

在你如何编程方式设置焦点在已经具有焦点WPF ListBox中的SelectedItem? ,该解决方案是使用聚焦的方法和在C#侧。

是否有可能在MVVM只使用XAML?

Answer 1:

我发现从我的同事回答。 通过与当前所选项目的setter(IsSelected属性)触发FocusManager.FocusedElement问题就解决了。

        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <!-- Edited: add pushpraj code to hide the dashed rectangle on focused item -->
                <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListBox.ItemContainerStyle>


Answer 2:

如果你不感兴趣的焦点(虚线)矩形,且只能在纯XAML的解决方案有兴趣,那么你或许可以将其隐藏

这里是一个样本

<ListBox>
    <ListBox.Resources>
        <Style TargetType="ListBoxItem">
            <Setter Property="FocusVisualStyle"
                    Value="{x:Null}" />
        </Style>
    </ListBox.Resources>
    <ListBoxItem>item 1</ListBoxItem>
    <ListBoxItem>item 2</ListBoxItem>
    <ListBoxItem>item 3</ListBoxItem>
</ListBox>

样品中的感兴趣的区域是StyleListBoxItem其设定为空值FocusVisualStyle这通常是虚线矩形。

这是不等同于同步与所选择的项中的聚焦元件,但它是隐藏的焦点层所以虚线矩形不会出现。



文章来源: How to Synchronize ListBox SelectedItem and the focused item in WPF?