我正在使用MVVM处理WPF应用程序。 我有一个带有选项卡的视图和一个列表框(不是tabControl的一部分),它显示视图上的所有验证错误(使用INotifyDataErrorInfo接口)。
我想要实现的目标:单击列表框中的项目后,焦点将转到带有相应控件的选项卡,并将焦点设置在该控件上。 例如,我对First Name有一个验证错误,因此当我单击列表框中描述第一个名称的验证错误的项目时,我想切换到First Name文本框所在的选项卡并为此设置焦点文本框。现在,我按照这里写的内容: Set focus on textbox in WPF from view model (C#)
特别是Zamotic回复(他和我有相同的情况)。
现在,上面介绍的情况对我来说对文本框很有用:它确实进入了First Name文本框并为它设置了焦点。
问题是我的一个标签中有一个WPF自定义控件,当我点击列表框中有关此自定义控件的验证错误时,它确实转到正确的选项卡,但没有设置焦点到自定义控件。 自定义控件由textBox组成,我希望将焦点设置为此文本框。
那么,如何在自定义控件中处理Focus以使其符合上述描述要求?
以下是我的自定义控件的代码(我尝试处理焦点的代码部分):
public class NumericUpDownControl : Control
{
static NumericUpDownControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericUpDownControl), new FrameworkPropertyMetadata(typeof(NumericUpDownControl)));
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
AttachToVisualTree();
this.GotFocus += new RoutedEventHandler(GetFocusHandler);
this.LostFocus += new RoutedEventHandler(LostFocusHandler);
}
private void GetFocusHandler(object sender, RoutedEventArgs e)
{
TextBox.Focus();
this.Focusable = false;
}
private void LostFocusHandler(object sender, RoutedEventArgs e)
{
IncreaseButton.Focus();
}
Textbox是Generic.xaml
中自定义控件Themes文件夹中设置的文本框var textBox = GetTemplateChild("valueBox") as TextBox;
if (textBox != null)
{
TextBox = textBox;
那么,我如何处理焦点以实现我已经为文本框实现的目标?
编辑1:顺便说一句,IncreaseButton是我的自定义控件所包含的另一个控件(它是一个按钮)。当我的自定义控件失焦时,我想从文本框中提取焦点,所以我只是为所提到的按钮设置它。
编辑2:在我看来,我有一个带有上述自定义控件的标签。在我的视图模型中,我有一个名为
的属性public bool IsAgeFocused
在视图中我写了以下内容:
<numeric:NumericUpDownControl
x:Name="numericUpDownBox"
uiExtension:FocusExtension.IsFocused="{Binding IsAgeFocused}"
焦点扩展是相同的类(没有任何其他信息),如链接:
Set focus on textbox in WPF from view model (C#)
Zamotic帖子中描述的版本(具有可见性部分)。