从ListBox中选择后,将Focus设置为TextBox

时间:2014-03-21 16:19:56

标签: .net wpf textbox listbox focus

当用户从ListBox中选择一个值时,我希望tbEntry获得焦点 tbEntry.Focus();在SelectedPastEntry集中什么都不做 (tbEntry使用ListBox中的值填充) tbEntry.Focus();在Button_Click确实有效。

如何从ListView中选择后让tbEntry条目获得焦点?

<TextBox  Grid.Row="1" x:Name="tbEntry" Text="{Binding Path=Entry, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" AcceptsReturn="True"/>
<ListBox x:Name="lbPast"  Grid.Row="2" ItemsSource="{Binding Path=PastEntries}" ScrollViewer.VerticalScrollBarVisibility="Visible"
            SelectedItem="{Binding Path=SelectedPastEntry, Mode=TwoWay}"/>
<Button Grid.Row="3" Click="Button_Click" Content="focus"/>


public string SelectedPastEntry 
{
    get { return selectedPastEntry; }
    set 
    {
        selectedPastEntry = null;
        entry = value;
        NotifyPropertyChanged("SelectedPastEntry");
        NotifyPropertyChanged("Entry");
        tbEntry.Focus();
    }
}
private void Button_Click(object sender, RoutedEventArgs e)
{
    tbEntry.Focus();
}

以下效果更好
由于某种原因,lbPast.SelectedIndex = -1;使重点工作有些次 第一次在lbPast中选择一个项目时,焦点转到tbEntry
问题是如果再次选择相同的项目,则lbPast项目将获得焦点
选择相同项目的问题是不会触发set 但是在第一次点击时,我看到调用了SelectedPastEntry并返回了null 所以不知道为什么在第二次选择同一项目时没有调用set

public string SelectedPastEntry 
{
    get { return selectedPastEntry; }
    set 
    {
        if (selectedPastEntry == value || (string.Compare(selectedPastEntry, entry, true) == 0))
        {
            selectedPastEntry = null;
            lbPast.SelectedIndex = -1;
            NotifyPropertyChanged("SelectedPastEntry");
            tbEntry.Focus();
        }
        //selectedPastEntry = value;
        selectedPastEntry = null;
        lbPast.SelectedIndex = -1;
        NotifyPropertyChanged("SelectedPastEntry");
        entry = value;
        NotifyPropertyChanged("Entry");               
        tbEntry.Focus();
    }
}

这是解决方案 我知道你会怀疑这个但是selectedPastEntry被设置为null并且看到了被调用(通过lbPast) 但这并没有改变lbPast.SelectedValue

的值
private void lbPastSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Debug.WriteLine(SelectedPastEntry);   // this is null
    Debug.WriteLine(lbPast.SelectedValue);  // this is not null
    if (lbPast.SelectedIndex != -1)
        lbPast.SelectedIndex = -1;
    if (lbPast.SelectedValue != null)
        lbPast.SelectedValue = null;
    tbEntry.Focus();
}

2 个答案:

答案 0 :(得分:1)

设置属性不是将焦点设置为Control的最佳位置。而不是尝试ListView的{​​{3}}事件:

  

选择选择器时发生。

示例:

<强> XAML

<ListView SelectionChanged="ListView_SelectionChanged" />

<强> Code-behind

private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    tbEntry.Focus();
}

或者您可以这样做:为PropertyChanged事件创建处理程序并检查已更新的属性类型:

public MyViewModel() 
{
    MyModel = new MyModel();        
    MyModel.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(MyModel_PropertyChanged);
}

private void MyModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if (e.PropertyName.Equals("SelectedPastEntry")) 
    {
        System.Diagnostics.Debug.WriteLine("SelectedPastEntry changed");
    }            
}

答案 1 :(得分:0)

设置表单的ActiveControl属性,你应该没问题

this.ActiveControl = tbEntry;