首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板