gpt4 book ai didi

c# - 命令和触发器之间的主要区别是什么? (赛马林)

转载 作者:搜寻专家 更新时间:2023-11-01 09:19:39 24 4
gpt4 key购买 nike

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

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

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

最近发现了“触发器”,“点击”等事件可以通过触发器 Action 类来实现。

命令示例:

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

触发器示例:

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

触发器让我想起了一些 OnClicked 事件处理程序,这对于一般用途来说并不理想。

最佳答案

每个页面都有一个 BindingContext,这将是您的 View 模型。您当然可以在后面编写代码并在代码中引用控件,但这只会给您留下一个难以维护的应用程序,并且您的 UI 和业务逻辑混合在一起。

当然,您可以拥有带 View 模型的页面和不带 View 模型的页面,大多数 MVVM 框架都允许这样做。

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

例如,对于一个事件,您必须直接订阅该实例。MyClassInstance.SomeEvent += eventHandlerMethod();

大多数时候这意味着您必须在设计时知道订阅

但是可以仅通过名称引用命令,包括在您的 XAML 绑定(bind)中。这意味着它更流畅,并且会在运行时绑定(bind)到您的上下文。

            <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”在一种情况下可以绑定(bind)到照片并让照片处理器处理它......在另一种情况下绑定(bind)到音乐文件并且因为处理程序来自不同的上下文它将知道如何处理该数据类型。

如果没有事件所具有的紧密绑定(bind),您可以从监听器添加一个新的监听器,而不必知道从谁/哪里发出命令。您不必知道 FileDoneDownloadingCommand 深埋在 ApplicationVM.Media.Handlers.REST.Services.Transfers 中 - 您只需要知道您正在监听要提出的命令。稍后当有人重构该服务时,将命令移动到更容易记住的位置,所有订阅者都不会中断。使其成为更易于维护的架构。

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

关于c# - 命令和触发器之间的主要区别是什么? (赛马林),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57325644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com