命令和触发器之间的主要区别是什么? (Xamarin)

时间:2019-08-02 11:30:32

标签: c# android xaml xamarin xamarin.forms

在Xamarin中处理按钮按下事件的主要区别和最佳方法是什么?

是通过使用命令模式(MVVM)还是通过实现触发器?

直到现在,我一直在使用命令模式,将按钮与命令绑定在一起,并实现“ Execute”方法。

最近,我发现了“触发器”,并且可以通过触发器动作类来实现诸如“点击”之类的事件。

命令示例:

    <Button x:Name="loginButton"
            Text="Login"
            Command="{Binding EmailLoginCommand}"
            CommandParameter="{Binding UserLoginInfo}"/>

触发器示例:

    <EventTrigger Event="Clicked">
            <triggers:UploadMediaButtonTriggerAction />
    </EventTrigger>

触发器使我想起了OnClicked事件处理程序,这对于一般用途而言并不理想。

1 个答案:

答案 0 :(得分:2)

每个页面都有一个BindingContext,它将是您的viewmodel。当然,您可以在后面编写代码并引用代码中的控件,但是这样就给您留下了维护噩梦的应用程序,并且您将UI和业务逻辑混合在一起。

您当然可以拥有带有视图模型的页面,而没有MVVM框架允许的页面。

命令的耦合程度少于事件。将它们视为事件的下一个演变。

例如,在事件上,您必须直接预订该实例。 MyClassInstance.SomeEvent += eventHandlerMethod();

多数情况下,这意味着您必须在设计时就知道订阅内容

但是可以仅通过名称来引用命令,包括在您的XAML绑定中。这意味着它更加流畅,并且将在RUNTIME绑定到您的上下文。

            <Button HeightRequest="55"
                    Margin="0,7,0,0"
                    VerticalOptions="CenterAndExpand"
                    BackgroundColor="Green"
                    Command="{Binding AcceptThisCommand}"
                    CommandParameter="{Binding SelectedDocument}"
                    FontSize="{StaticResource MediumFontSize}"
                    IsVisible="{Binding IsSomethingDoneProperty,
                                        Converter={StaticResource BoolInvertConverter}}"
                    Text="{StaticResource Accept}"
                    TextColor="{StaticResource SecondaryTextColor}"
                    Style="{StaticResource ButtonStyleLrg}" />

命令也可以采用不需要在设计时定义的参数。因此,您几乎可以随命令一起发送任何运行时对象,并使处理程序关注如何解释它。在上面的示例中,当引发命令时,它将带有SelectedDocument作为参数。因此,当您单击按钮时,您没有订阅Button.Click,然后被迫跳过箍以处理某些特定对象。相反,“ AcceptThis”的处理程序将接收实际的文档。然后,也可以将同一命令处理程序分配给菜单项...或ListView选择...,或下载文档并应自动接受的网络调用。所有其他选项都不必知道命令的定义位置。所有其他选项都不必提供相同的参数对象。

将所有内容放在一起意味着在一种情况下,“ AcceptThisCommand”可以绑定到照片,并由照片处理器处理...在另一种情况下,可以绑定到音乐文件,因为处理程序来自在不同的上下文中,它将知道如何处理该数据类型。

在没有事件绑定的情况下,您可以从侦听器中添加新的侦听器,而不必知道从何处发起命令。您不必知道FileDoneDownloadingCommand被埋在ApplicationVM.Media.Handlers.REST.Services.Transfers中很深-您只知道您正在侦听要发出的命令。后来当有人重构该服务时,将命令移动到更容易记住的位置,所有订户都不会中断。使它成为更具可维护性的体系结构。

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/data-bindings-to-mvvm