gpt4 book ai didi

c# - Mvvm中的ICommand是什么原因?

转载 作者:行者123 更新时间:2023-11-30 13:25:42 25 4
gpt4 key购买 nike

在使用 mvvm 方法的应用程序中,ViewModel 提供一个或多个 Command 属性是很常见的。这些属性通常具有 ICommandDelegateCommand 或类似的类型。

我不明白为什么我们需要在 mvvm 应用程序中使用这种方法。提供公共(public)方法并将 View 中的操作直接绑定(bind)到此公共(public)方法是否足够?

为什么 ICommand 存在?

最佳答案

Wouldn't it be enough to provide public methods and bind the action from the view directly to this public method? Why ICommand exists?

  1. 您不能绑定(bind)到 xaml 中的方法。你需要一个对象。因此,您需要将方法包装到一个对象中。

  2. UI 中的一种常见模式是,某些操作并非始终可用。在登录表单中,仅当您输入用户名时登录操作才可用。在 MS Word 中,“复制”或“剪切”操作仅在您选择某些内容时才可用,否则按钮将被禁用并且键盘快捷键将处于非事件状态

  3. 这是一种常见的模式,可以使用不同的参数调用该命令。

普通事件处理程序不满足这些要求,但 ICommand 服务于这些目的:

public interface ICommand
{
void Execute(object parameter);
bool CanExecute(object parameter);
event EventHandler CanExecuteChanged;
}
  1. 将方法包装到一个对象
  2. 它表示命令是否可用,因此 UI 组件(通常是按钮或菜单项)可以反射(reflect)它
  3. 此外,它会通知 UI 组件命令的可用性已更改,以便 UI 可以反射(reflect)它。

现在,让我们考虑复制和粘贴场景。使用 ICommand 标记可以如下所示:

<Button Content="Paste" Command="{Binding PasteCommand}" />
<MenuItem Header="Paste" Command="{Binding PasteCommand}" />
public ICommand PasteCommand {get;} = new DelegateCommand(Paste, () => Clipboard != null);

没有 ICommand 会是什么样子?为了更容易,让我们考虑一下,XAML 将允许绑定(bind)到方法:

<Button Content="Paste" Click="{Binding Paste}" IsEnabled="{Binding CanPaste}" />
<MenuItem Header="Paste" Click="{Binding Paste}" IsEnabled="{Binding CanPaste}"/>

public void Paste() {....}

private bool _canPaste;
public bool CanPaste
{
get { return _canPaste }
set
{
if (_canPaste != value)
{
_canPaste = value;
OnNotifyPropertyChanged(nameof(CanPaste);
}
}
}

如您所见,它不仅更加冗长,而且还违反了 DRY 原则。每次要使用该命令时,都需要指定 PasteCanPaste 绑定(bind)。如果您开始时没有使用 CanPaste,后来又想添加它,该怎么办?然后,您必须在每次 Paste 调用时添加 CanPaste 绑定(bind)。我向你保证,你会在某个地方忘记它。

现在,如果您在 WPF 中这样做:

<Button Content="Paste" Click="Call_ViewModel_Paste" />
//in codebehind:
void Call_ViewModel_Paste(oobject sender, RoutedEventArgs e)
{
ViewModel.Paste();
}

或最终:

<Button Content="Paste">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction MethodName="Paste" TargetObject="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>

这两种方法都是正确的,它们遵循 MVVM 原则并且可以在没有 ICommand 的情况下工作,但是正如您所看到的,两者都没有 ICommand

优雅

关于c# - Mvvm中的ICommand是什么原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42113388/

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