UWP EventTriggerBehaviors按钮GotFocus

时间:2017-04-12 08:47:29

标签: c# xaml uwp behavior eventtrigger

我试图了解如何在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代码应该是什么?

实际上,有人能够推荐关于这个主题的精彩阅读,例子,书籍吗?

更新以下詹姆斯回复: XAML InvokeCommandAction变为:

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

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

1 个答案:

答案 0 :(得分:1)

InvokeCommandAction Command属性需要在视图模型中实现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中TextBox的Text属性。

对于要看一看的事情,我会建议你看一下MVVM框架(可能是MvvmLight)并阅读它,如果你还没有。

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

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