在 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中文网其他相关文章!