在TextBox获得焦点时需要帮助校准Message.Attach

时间:2011-03-17 15:21:23

标签: c# wpf xaml attached-properties caliburn.micro

我有一个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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我自己尝试了这个,并且能够复制这个问题。我不太清楚为什么会发生这种情况,它可能与用户控件(即视图)生命周期有关。一个选项可能是扩展附加属性,以便它在视图模型调用uie.Focus()时调用动词。

动词的名称可以是FocusExtension附加属性的依赖属性,可以在视图中设置。