WPF在项目添加到列表框时将焦点设置在文本框上

时间:2014-07-29 03:48:04

标签: c# wpf listbox setfocus

我有一个列表框,其中一个Add按钮映射到VM中SelectedItem属性支持的命令。

将项目添加到列表框时,我将SelectedItem设置为新项目,使其在列表框中具有焦点。我想要一个文本框(该新项目的数据条目)来获得焦点。

我一直在看事件触发器,但我还没有看到一种交叉项目的方法,但基本上我认为我想要的是列表框选择的事件触发器更改为将焦点设置在文本框上。

我将如何做到这一点?

作为示例,我有以下XAML代码。这将添加一个Person(仅限名称和年龄属性)

基本上我希望txtName文本框在列表框中选中一个项目时具有焦点。

 <StackPanel>
    <TextBlock>Name</TextBlock>
    <TextBox Text="{Binding NewPerson}"></TextBox>
    <Button Command="{Binding AddPersonDelegateCommand}">Add</Button>
    <Button>Remove</Button>
    <ListBox ItemsSource="{Binding People}" DisplayMemberPath="Name" 
             SelectedItem="{Binding SelectedPerson}">

    </ListBox>
    <TextBox Name="txtName" Text="{Binding SelectedPerson.Name, Mode=TwoWay}"</TextBox>
    <TextBox Name="txtAge" Text="{Binding SelectedPerson.Age, Mode=TwoWay}"></TextBox>
</StackPanel>

1 个答案:

答案 0 :(得分:1)

这是基于xaml的触发器,当txtName属性从null切换时,将焦点设置在SelectedItem TextBox上

所以这里的想法是你将SelectedPerson属性设置为null,然后是新创建的person对象的实例,这应该可以解决问题,并将焦点设置为所需的TextBox

此触发器的限制是您需要在设置为新对象之前将SelectedPerson属性设置为null,如果这对您不起作用,则附加行为也可以解决该问题。

<StackPanel>
    <TextBlock>Name</TextBlock>
    <TextBox Text="{Binding NewPerson}"></TextBox>
    <Button Command="{Binding AddPersonDelegateCommand}">Add</Button>
    <Button>Remove</Button>
    <ListBox DisplayMemberPath="Name"
             x:Name="list"
             SelectedItem="{Binding SelectedPerson}">
    </ListBox>
    <TextBox Name="txtName"
             Text="{Binding SelectedPerson.Name, Mode=TwoWay}">
        <TextBox.Style>
            <Style TargetType="TextBox">
                <Setter Property="FocusManager.FocusedElement"
                        Value="{Binding RelativeSource={RelativeSource Self}}" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding SelectedItem,ElementName=list}"
                                 Value="{x:Null}">
                        <Setter Property="FocusManager.FocusedElement"
                                Value="{x:Null}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>
    <TextBox Name="txtAge"
             Text="{Binding SelectedPerson.Age, Mode=TwoWay}"></TextBox>
</StackPanel>