如何从视图模型中聚焦列表框中的项目。

问题描述 投票:0回答:1

我做了自动完成,我想在列表框中用上下键完成结果,在此之前,我必须从写文字的文本框中聚焦列表框的第一项。

<TextBox Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Name="Client" Text="{Binding Client}" cal:Message.Attach="[Event KeyUp] = [Action ExecuteFilterView($executionContext)]" Validation.ErrorTemplate="{x:Null}" >
                    <TextBox.Style>
                        <Style>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding UserCanChooseClient}" Value="True">
                                    <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=Clients}"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBox.Style>
                </TextBox>
<ListBox x:Name="Clients" Width="190" Height="auto" MaxHeight="400" Margin="5 28 0 0" cal:Message.Attach="[Event KeyUp] = [Action ExecuteClientsView($executionContext)]; [Event MouseLeftButtonUp]=[Action HandleClientChosenClick($eventArgs)]" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden" SelectedItem="{Binding Path=SelectedClient}" ItemsSource="{Binding Path=Clients}" DisplayMemberPath="Description" SelectedValuePath="Code"></ListBox>

但焦点管理器关注的是列表框,而不是第一项。我必须按下两次按钮才能开始在列表中穿行。改变listbox中的SelectedClient属性也没有用。

wpf caliburn.micro
1个回答
0
投票

在Listbox发送的SelectionChanged事件或其他事件中,我必须把焦点放在第一个项目上。

cal:Message.Attach="[Event SelectionChanged] = [Action LstBox_OnSelectionChanged($source, $eventArgs]"

public void LstBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
        var lstbox = (ListBox) sender;
        var item = (ListBoxItem)lstbox.ItemContainerGenerator.ContainerFromItem(lstbox.SelectedItem);

        if (item != null)
            item.Focus();
}

如果你想在启动时选择listbox的第一项,你可以使用事件Loaded:

cal:Message.Attach="[Event Loaded] = [Action LstBox_OnLoaded($source)]"

    public void LstBox_OnLoaded(object sender)
    {
        var lstbox = (ListBox)sender;
        lstbox.SelectedIndex = 0;
        var item = (ListBoxItem)lstbox.ItemContainerGenerator.ContainerFromItem(lstbox.SelectedItem);
        if (item != null)
            item.Focus();
    }
© www.soinside.com 2019 - 2024. All rights reserved.