在WPF中从ViewModel设置TextBox焦点
问题:
在WPF应用程序中,当条件失败时向用户显示错误消息后,目标是将焦点设置回特定的TextBox。但是,当前使用System.Windows.Input.Keyboard.Focus的方法不起作用。
疑问:
如何在WPF中从ViewModel设置TextBox的焦点?
解答:
第一部分:可访问性考虑
需要注意的是,在ViewModel中直接引用UI元素(例如,cs.txtCompanyID)违反了MVVM模式,并可能导致可访问性问题。相反,应依赖数据绑定机制与UI进行通信。
第二部分:调试.NET源代码
为了有效地排除焦点问题,请考虑调试.NET源代码。请参考Shawn Bruke的博客,了解如何启用.NET源代码调试。
第三部分:使用附加属性
从ViewModel设置焦点的有效方法是使用附加属性。创建一个名为IsFocused的附加属性,并使用以下实现:
<code class="language-csharp">public static class FocusExtension { public static bool GetIsFocused(DependencyObject obj) {...} public static void SetIsFocused(DependencyObject obj, bool value) {...} public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached(...); private static void OnIsFocusedPropertyChanged(...) {...} }</code>
在您的XAML视图中,将IsFocused附加属性绑定到ViewModel中触发焦点的属性:
<code class="language-xml"><TextBox local:FocusExtension.IsFocused="{Binding IsUserNameFocused}" /></code>
当ViewModel中此属性更新时,UI元素将自动获得焦点。
This revised answer maintains the image and uses more concise and natural language while preserving the original meaning. The code snippets are also retained.
以上是如何将焦点从ViewModel设置为WPF TextBox?的详细内容。更多信息请关注PHP中文网其他相关文章!