数据绑定焦点控件仅附加 属性 一次 运行

Databound Focus Control Attached Property only running once

我正在尝试将焦点设置在一个文本框上,它确实第一次起作用了。但是当我之后将 Editable 设置为 true 时,SetControlFocus.OnSetFocusChanged 不会再次 运行。

这是我一直用于附加 属性 的代码:

public class SetControlFocus
{
    public static readonly DependencyProperty SetFocusProperty = DependencyProperty.RegisterAttached("SetFocus",
                                                                           typeof(Boolean),
                                                                           typeof(SetControlFocus),
                                                                           new PropertyMetadata(false, OnSetFocusChanged));

    private static void OnSetFocusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d != null && d is UIElement)
        {
            if ((bool)e.NewValue)
            {
                (d as UIElement).GotFocus += OnLostFocus;
                (d as UIElement).Focus();
            }
            else
            {
                (d as UIElement).GotFocus -= OnLostFocus;
            }
        }
    }

    private static void OnLostFocus(object sender, RoutedEventArgs e)
    {
        if (sender != null && sender is UIElement)
        {
            (sender as UIElement).SetValue(SetFocusProperty, false);
        }
    }

    public static Boolean GetSetFocus(DependencyObject target)
    {
        return (Boolean)target.GetValue(SetFocusProperty);
    }

    public static void SetSetFocus(DependencyObject target, Boolean value)
    {
        target.SetValue(SetFocusProperty, value);
    }
}

这是绑定在表单 XAML:

上的文本框
<TextBox ExternEvents:SetControlFocus.SetFocus="{Binding SetFocused}" Visibility="{Binding IsEditableVis}" Text="{Binding Body}" />

这是视图模型中的代码:

    public bool SetFocused
    {
        get { return m_IsEditable; }
    }

    private bool m_IsEditable;

    public bool IsEditable
    {
        get { return m_IsEditable; }
        set
        {
            this.OnPropertyChanging("IsEditable");
            m_IsEditable = value;
            this.OnPropertyChanged("IsEditable");
            this.OnPropertyChanged("SetFocused");
        }
    }

至于我是如何测试它的,我连接了一个普通按钮,它在将 IsEditable 设置为 true 和 false 之间交替。当 IsEditable 为 false 时,文本框被隐藏,导致它失去焦点。

单步执行调试器时,第一次出现以下步骤:

第二次及以后,SetControlFocus和getter没有被调用:

我不知道是什么导致了这种情况发生。我已尝试将绑定设置为 Two-Way 以及将 m_IsEditable 和 IsEditable 的各种组合设置为 false,但此行为不会改变。我相信,如果我至少可以再次调用附加的 属性 的 SetControlFocus,我将能够将焦点设置在控件上。

有什么想法可以重置,以便每次将 IsEditable 设置为 true 时 SetControlFocus 都能正常工作吗?

再次尝试将绑定更改为 Two-Way,这次好像可以了。