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

时间:2015-05-02 07:59:28

标签: c# wpf mvvm focus attached-properties

我正在尝试将焦点设置在文本框上,并且第一次确实有效。但是当我之后将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}" />

以下是viewmodel中的代码:

    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时,文本框将被隐藏,导致其失去焦点。

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

  • 进入IsEditable的 setter
  • 属性更改“IsEditable”通知
  • m_IsEditable 设为true
  • 内容已更改“IsEditable”
  • 的通知
  • 属性已更改“SetFocused”通知
  • 进入SetFocused的 getter ,返回true。
  • 致电 SetControlFocus.OnSetFocusChanged
  • 附加活动 OnFostFocus for GotFocus
  • 运行 UIElement.Focus()
  • 运行 SetControlFocus.OnLostFocus(...)
  • 分离事件 OnLostFocus事件
  • 从SetControlFocus.OnSetFocusChanged
  • 返回
  • 从IsEditable的设置者
  • 返回

第二次及以后的时间,不调用SetControlFocus和getter:

  • 进入IsEditable的 setter
  • 属性更改“IsEditable”通知
  • m_IsEditable 设为true
  • 内容已更改“IsEditable”
  • 的通知
  • 属性已更改“SetFocused”通知
  • 从IsEditable的设置者
  • 返回

我无法弄清楚导致这种情况发生的原因。我已尝试将绑定设置为双向,并将m​​_IsEditable和IsEditable的各种组合设置为false,但此行为不会更改。我相信如果我至少可以再次调用附加属性的SetControlFocus,我将能够专注于控件。

我可以重置哪些想法,以便每次将IsEditable设置为true时SetControlFocus都能正常工作?

1 个答案:

答案 0 :(得分:0)

尝试再次将绑定更改为双向,这次似乎有效。