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