我有一个TextBox,我将焦点放在使用绑定到视图模型属性的附加属性上。附加属性调用“UIElement.Focus()”来设置焦点。问题是当TextBox以这种方式获得焦点时,“GotFocus”事件不会触发。我正在使用Caliburn.Micro的Message.Attach来处理这个事件。有什么想法吗?
这是TextBox。
<TextBox x:Name="Test"
Grid.Column="0"
Text="{Binding Test, Converter={StaticResource TestToStringConverter}}"
AttachedProperties:FocusExtension.IsFocused="{Binding IsTestFocused}"
cal:Message.Attach="[Event GotFocus] = [Action OnGotFocus($eventargs)]; />
这是附属物(在SO上找到)。
public static class FocusExtension
{
public static bool GetIsFocused(DependencyObject obj)
{
return (bool) obj.GetValue(IsFocusedProperty);
}
public static void SetIsFocused(DependencyObject obj, bool value)
{
obj.SetValue(IsFocusedProperty, value);
}
public static readonly DependencyProperty IsFocusedProperty =
DependencyProperty.RegisterAttached("IsFocused", typeof (bool), typeof (FocusExtension),
new UIPropertyMetadata(false, OnIsFocusedPropertyChanged));
private static void OnIsFocusedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var uie = (UIElement)d;
if ((bool)e.NewValue)
{
uie.Focus();
}
}
}
答案 0 :(得分:0)
我自己尝试了这个,并且能够复制这个问题。我不太清楚为什么会发生这种情况,它可能与用户控件(即视图)生命周期有关。一个选项可能是扩展附加属性,以便它在视图模型调用uie.Focus()
时调用动词。
动词的名称可以是FocusExtension
附加属性的依赖属性,可以在视图中设置。