按钮 GotFocus 的 UWP EventTriggerBehaviors

UWP EventTriggerBehaviors to button GotFocus

我想了解如何在 UWP 项目中设置 EventTriggerBehaviors。 所以我知道我需要安装包 Microsoft.Xaml.Behaviors.Uwp.Managed,并在我的 XAML 文件中声明以下命名空间:

xmlns:Core="using:Microsoft.Xaml.Interactions.Core"
xmlns:Interactivity="using:Microsoft.Xaml.Interactivity"

按钮本身应声明为:

<Button x:Name="btnTest >
    <Interactivity:Interaction.Behaviors>
        <Core:EventTriggerBehavior EventName="GotFocus" >
            <Core:EventTriggerBehavior.Actions>
                <Core:InvokeCommandAction Command="{Binding ... }" />
            </Core:EventTriggerBehavior.Actions>
        </Core:EventTriggerBehavior>
    </Interactivity:Interaction.Behaviors>
</Button>

但后来我迷路了...我想要的是一旦按钮获得焦点,它就会在文本框中设置一些文本(基于按钮名称)。

我需要服务吗?ViewModel 代码应该是什么?

实际上,有人能推荐关于这个主题的好书、例子、书籍吗​​?

更新以下 James 回复: XAML InvokeCommandAction 变为:

<Core:InvokeCommandAction Command="{Binding OnButtonFocusCommand}" CommandParameter="{Binding Name, ElementName=btnTest}" />

但是如何在 ViewModel 的方法中接收参数?

InvokeCommandAction 命令 属性 需要在视图模型中实现 ICommand,以便在触发 EventTriggerBehavior 时执行操作。

您可能在 XAML:

中有类似的内容
    <Button x:Name="btnTest">
        <Interactivity:Interaction.Behaviors>
            <Core:EventTriggerBehavior EventName="GotFocus">
                <Core:EventTriggerBehavior.Actions>
                    <Core:InvokeCommandAction Command="{Binding OnButtonFocusCommand}" />
                </Core:EventTriggerBehavior.Actions>
            </Core:EventTriggerBehavior>
        </Interactivity:Interaction.Behaviors>
    </Button>

然后在绑定的视图模型中,你会得到类似这样的东西:

    public ViewModel()
    {
        OnButtonFocusCommand = new DelegateCommand(() =>
        {
            this.TextBoxText = "Hello, World";
        });
    }

    public ICommand OnButtonFocusCommand { get; private set; }

尽管平台并未内置 DelegateCommand,但您可以在线找到 DelegateCommand 或 RelayCommand 的许多实现。

编辑:您也可以像这样使用传递的参数来执行此操作:

    public ViewModel()
    {
        OnButtonFocusCommand = new DelegateCommand<RoutedEventArgs>(args =>
            {
                this.TextBoxText = "Hello, World";
            });
    }

RoutedEventArgs 将是您传递的参数类型。对于 Focus 事件传递的内容,这是您将收到的参数。在这些情况下,您需要 DelegateCommand{T}

我引用的 DelegateCommand 示例也有一种机制来检查是否 运行 通过验证模型来执行操作。你可以这样做:

    public ViewModel()
    {
        OnButtonFocusCommand = new DelegateCommand<RoutedEventArgs>(args =>
            {
                this.TextBoxText = "Hello, World";
            },
            args => args.OriginalSource is TextBox);
    }

对于更新 TextBox 文本的场景,您需要在视图模型中创建一个 属性(在我的示例中,我展示了正在更新的 TextBoxText)。然后 属性 需要绑定到 XAML.

中文本框的文本 属性

对于要看的东西,我建议先看一下 MVVM 框架(可能是 MvvmLight),如果您还没有阅读它的话。

此外 official Microsoft samples on GitHub 可能涵盖了很多可能对您有用的主题。

如果您需要更多信息,请与我们联系,我们很乐意提供帮助。