WPF自定义控件中的焦点处理(从视图模型设置焦点在WPF自定义控件上)

时间:2014-07-05 15:31:43

标签: c# wpf xaml focus

我正在使用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帖子中描述的版本(具有可见性部分)。

0 个答案:

没有答案