首页 > 后端开发 > C++ > 如何以编程方式从 ViewModel 将焦点设置到 WPF 中的文本框?

如何以编程方式从 ViewModel 将焦点设置到 WPF 中的文本框?

Linda Hamilton
发布: 2025-01-26 01:56:12
原创
492 人浏览过

How Can I Programmatically Set Focus to a TextBox in WPF from the ViewModel?

在 WPF 中通过 ViewModel 设置 TextBox 的焦点

在处理 WPF 视图中的按钮点击事件时,可能需要显示错误消息,然后将焦点转移到特定的 TextBox 控件。但是,在 ViewModel 中执行如下代码并不能将光标设置到所需的 TextBox:

<code class="language-csharp">if (companyref == null)
{
    var cs = new Lipper.Nelson.AdminClient.Main.Views.ContactPanels.CompanyAssociation(); 

    MessageBox.Show("Company does not exist.", "Error", MessageBoxButton.OK,
                    MessageBoxImage.Exclamation);

    cs.txtCompanyID.Focusable = true;

    System.Windows.Input.Keyboard.Focus(cs.txtCompanyID);
}</code>
登录后复制

此问题的原因在于直接在 ViewModel 中引用 UI 元素,这是一种通常不推荐的做法。为了解决这个问题,我们需要使用其他技术。

使用附加属性

一种方法是创建一个附加属性,该属性可以应用于任何 UIElement 并绑定到 ViewModel 属性,例如“IsFocused”。当此属性的值发生变化时,它可以设置元素的焦点,允许我们将其绑定到 ViewModel 的状态。此附加属性的实现可能如下所示:

<code class="language-csharp">public static class FocusExtension
{
    public static bool GetIsFocused(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsFocusedProperty);
    }

    public static void SetIsFocused(DependencyObject obj, bool value)
    {
        obj.SetValue(IsFocusedProperty, value);
    }

    public static readonly DependencyProperty IsFocusedProperty =
        DependencyProperty.RegisterAttached(
            "IsFocused", typeof(bool), typeof(FocusExtension),
            new UIPropertyMetadata(false, OnIsFocusedPropertyChanged));

    private static void OnIsFocusedPropertyChanged(
        DependencyObject d, 
        DependencyPropertyChangedEventArgs e)
    {
        var uie = (UIElement)d;
        if ((bool)e.NewValue)
        {
            uie.Focus(); // 忽略 false 值。
        }
    }
}</code>
登录后复制

然后,可以在 XAML 中使用此附加属性绑定到 ViewModel 中的属性,从而可以通过编程方式设置焦点。

使用 .NET 源代码进行调试

对于复杂的焦点问题,使用 .NET 源代码进行调试以了解框架如何处理焦点可能会有所帮助。这可以提供宝贵的见解,并帮助查明任何问题。

替代方案

从 ViewModel 设置 TextBox 焦点的另一种方法是使用命令来执行行为。此行为可以在视图或 ViewModel 中实现,并可以绑定到按钮点击。然后,该行为可以使用与上述类似的技术将焦点设置到所需的 TextBox。

以上是如何以编程方式从 ViewModel 将焦点设置到 WPF 中的文本框?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板