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

C# 数据绑定焦点控件附加属性仅运行一次,c#,wpf,mvvm,focus,attached-properties,C#,Wpf,Mvvm,Focus,Attached Properties,我试着把焦点放在一个文本框上,它第一次就成功了。但是当我随后将Editable设置为true时,SetControlFocus.OnSetFocusChanged不会再次运行 以下是我一直用于附加属性的代码: public class SetControlFocus { public static readonly DependencyProperty SetFocusProperty = DependencyProperty.RegisterAttached("SetFocus",

我试着把焦点放在一个文本框上,它第一次就成功了。但是当我随后将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}" />
至于我是如何测试这个的,我有一个普通的按钮连接起来,在设置IsEditable为true和false之间交替。当IsEditable为false时,文本框被隐藏,导致其失去焦点

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

进入IsEditable的setter IsEditable的属性更改通知 m_IsEditable设置为true IsEditable的属性更改通知 SetFocused的属性更改通知 进入SetFocused的getter,返回true。 调用SetControlFocus.OnSetFocusChanged 为GotFocus附加事件OnLostFocus 运行UIElement.Focus 运行SetControlFocus.OnLostFocus。。。 分离事件OnLostFocus事件 从SetControlFocus.OnSetFocusChanged返回 从IsEditable的setter返回 不调用第二次和后续时间SetControlFocus和getter:

进入IsEditable的setter IsEditable的属性更改通知 m_IsEditable设置为true IsEditable的属性更改通知 SetFocused的属性更改通知 从IsEditable的setter返回 我不知道是什么导致了这一切。我尝试将绑定设置为双向,并将m_IsEditable和IsEditable的各种组合设置为false,但这种行为没有改变。我相信,如果我至少可以再次调用附加属性的SetControlFocus,我将能够在控件上设置焦点


你知道每次我将IsEditable设置为true时,我可以重置什么以使SetControlFocus正常工作吗?

再次尝试将绑定更改为双向,这次似乎正常工作

    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");
        }
    }