当用户从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();
}
答案 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;