为什么wpf控件只有一个命令? (MVVM)

Why wpf controls have only one command? (MVVM)

问题是为什么wpf控件只有一个命令?

我有这个问题是因为我正在创建自定义控件。我有两个事件。要绑定到视图模型 ICommand 属性,我需要使用 <i:Interaction.Triggers>。正如我认为我可以创建多个命令,将使用我的控件的人可以选择使用代码隐藏事件或将这些命令用于 mvvm。在那种情况下,没有人需要使用 <i:Interaction.Triggers>.

但据我所知,所有标准控件都只有一个命令。而且我无法理解和找到为什么控件只有一个命令的答案?为什么它是一种好的模式,为什么控制多个命令是不好的?

因为你只需要一个命令。当然,它可能是一个数组,但在 99.99% 的情况下,它更多的是 markup/hassle 0 收益。

在那个 0.01% 的情况下,你可以有一个命令......触发几个其他命令(或者甚至只是几个方法)写一个 CompositeCommand class 很简单,它留给程序员,很像 DelegateCommand.

在你的例子中,你是说你有两个独特的事件,它们将是命令可绑定的;这似乎很好。只是按钮只有一个有趣的事件(单击),该事件对于命令支持来说足够常见。

The question is why wpf controls have only one command?

没有规定控件必须限于单个命令。确实,通过 ICommandSource,按钮只显示一个命令。这对大多数控件都有意义,它们相对简单并且具有单一职责。但是,复杂的控件肯定可以定义多个。

Slider,例如声明和处理几个命令:

public static RoutedCommand IncreaseLarge { get; }
public static RoutedCommand DecreaseLarge { get; }
public static RoutedCommand IncreaseSmall { get; }
public static RoutedCommand DecreaseSmall { get; }
public static RoutedCommand MinimizeValue { get; }
public static RoutedCommand MaximizeValue { get; }

当然,Slider 不会通过实例级属性公开这些命令,因为没有理由允许它们被覆盖。它们都由滑块本身处理,它们都做同样的事情:它们改变滑块的当前值。用户只期望值发生变化时会发生一些事情; 如何 它改变了它不是很相关。重要信息通常可以通过单个 ValueChanged 事件传达。

我想不出一个普通的 WPF 控件 允许将多个命令分配给每个实例。也就是说,我可以很容易地 构想 这样的控件。例如,考虑一个带有向上和向下按钮的 'spinner' 控件。虽然微调器 上的 up/down 按钮可以 用于操纵单个标量值(如滑块),但您可能决定以完全不同的方式使用它。例如,您可能希望 up/down 按钮的功能类似于电梯呼叫按钮。如果微调器公开单独的 UpCommandDownCommand,您将保留适应这两种情况所需的灵活性。

如果您有一个自定义控件,并且您觉得定义多个命令是合适的,那就继续吧。

使用 RepeatButton

的连续命令调用

您在其中一条评论中提到了这个用例:

I need to do some continuous action while button is in down state

WPF 附带一个 RepeatButton 控件正是为了这个目的。您已经看到它用于默认 ScrollBar 模板中的箭头按钮。只需将 Command 绑定到按钮处于按下状态时要重复的任何操作:

<RepeatButton Content="Hold to Repeat Command"
              Command="{Binding YourRepetitiveCommand}" />