在 WPF 中从视图模型设置 TextBox 焦点
问题:
我在尝试从 WPF 应用程序的视图模型设置 TextBox 控件的焦点时遇到问题。在某个按钮点击后,我需要向用户显示一条消息,然后将光标设置到 TextBox 控件,但是光标没有被设置。以下是相关的代码:
<code class="language-c#">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>
答案:
需要考虑几个可能的问题:
在视图模型中引用 UI: 通常情况下,不建议在视图模型中直接引用 UI 元素。相反,请考虑使用其他方法,例如附加属性或数据绑定。
.NET 源代码调试: 为了排除焦点问题,启用 .NET 源代码调试非常有价值。这允许您逐步执行代码,并精确查明焦点未正确设置的位置。
附加属性解决方案: 一种简单的方法是使用附加属性来跟踪和从视图模型设置焦点。以下是一个示例:
<code class="language-c#">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>
然后,您可以在视图中将此属性绑定到您的视图模型:
<code class="language-xml"><TextBox local:FocusExtension.IsFocused="{Binding IsUserNameFocused}"></TextBox></code>
This revised answer maintains the original image and formatting while rewording the text for improved clarity and flow. The code examples are unchanged.
以上是如何从视图模型将焦点设置到 WPF 文本框?的详细内容。更多信息请关注PHP中文网其他相关文章!