数据绑定焦点控件仅附加 属性 一次 运行
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 时,文本框被隐藏,导致它失去焦点。
单步执行调试器时,第一次出现以下步骤:
- 进入IsEditablesetter
- 属性 正在更改 "IsEditable"
的通知
- m_IsEditable 设为真
- 属性 已更改 "IsEditable"
的通知
- 属性 已更改 "SetFocused"
的通知
- 进入SetFocused的getter,return正确。
- 通话SetControlFocus.OnSetFocusChanged
- 附加事件 GotFocus 的 OnLostFocus
- 运行 UIElement.Focus()
- 运行 SetControlFocus.OnLostFocus(...)
- 分离事件 OnLostFocus 事件
- return 来自 SetControlFocus.OnSetFocusChanged
- return 来自 setter 的 IsEditable
第二次及以后,SetControlFocus和getter没有被调用:
- 进入IsEditablesetter
- 属性 正在更改 "IsEditable"
的通知
- m_IsEditable 设为真
- 属性 已更改 "IsEditable"
的通知
- 属性 已更改 "SetFocused"
的通知
- return 来自 setter 的 IsEditable
我不知道是什么导致了这种情况发生。我已尝试将绑定设置为 Two-Way 以及将 m_IsEditable 和 IsEditable 的各种组合设置为 false,但此行为不会改变。我相信,如果我至少可以再次调用附加的 属性 的 SetControlFocus,我将能够将焦点设置在控件上。
有什么想法可以重置,以便每次将 IsEditable 设置为 true 时 SetControlFocus 都能正常工作吗?
再次尝试将绑定更改为 Two-Way,这次好像可以了。
我正在尝试将焦点设置在一个文本框上,它确实第一次起作用了。但是当我之后将 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 时,文本框被隐藏,导致它失去焦点。
单步执行调试器时,第一次出现以下步骤:
- 进入IsEditablesetter
- 属性 正在更改 "IsEditable" 的通知
- m_IsEditable 设为真
- 属性 已更改 "IsEditable" 的通知
- 属性 已更改 "SetFocused" 的通知
- 进入SetFocused的getter,return正确。
- 通话SetControlFocus.OnSetFocusChanged
- 附加事件 GotFocus 的 OnLostFocus
- 运行 UIElement.Focus()
- 运行 SetControlFocus.OnLostFocus(...)
- 分离事件 OnLostFocus 事件
- return 来自 SetControlFocus.OnSetFocusChanged
- return 来自 setter 的 IsEditable
第二次及以后,SetControlFocus和getter没有被调用:
- 进入IsEditablesetter
- 属性 正在更改 "IsEditable" 的通知
- m_IsEditable 设为真
- 属性 已更改 "IsEditable" 的通知
- 属性 已更改 "SetFocused" 的通知
- return 来自 setter 的 IsEditable
我不知道是什么导致了这种情况发生。我已尝试将绑定设置为 Two-Way 以及将 m_IsEditable 和 IsEditable 的各种组合设置为 false,但此行为不会改变。我相信,如果我至少可以再次调用附加的 属性 的 SetControlFocus,我将能够将焦点设置在控件上。
有什么想法可以重置,以便每次将 IsEditable 设置为 true 时 SetControlFocus 都能正常工作吗?
再次尝试将绑定更改为 Two-Way,这次好像可以了。