我正在尝试将焦点设置在文本框上,并且第一次确实有效。但是当我之后将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时,文本框将被隐藏,导致其失去焦点。
单步执行调试器时,第一次执行以下步骤:
第二次及以后的时间,不调用SetControlFocus和getter:
我无法弄清楚导致这种情况发生的原因。我已尝试将绑定设置为双向,并将m_IsEditable和IsEditable的各种组合设置为false,但此行为不会更改。我相信如果我至少可以再次调用附加属性的SetControlFocus,我将能够专注于控件。
我可以重置哪些想法,以便每次将IsEditable设置为true时SetControlFocus都能正常工作?
答案 0 :(得分:0)
尝试再次将绑定更改为双向,这次似乎有效。