CanExecute and CanExecuteChanged, I must implement these with a RelayCommand?
我正在使用 MVVM-Light,并且我的中继命令运行良好,我刚刚读到我应该实现
有没有人有一个很好的例子来说明如何实现这些。
CanExecute 在无法执行时需要返回 False 但不会只是禁用按钮 ??
我什么时候执行
任何人都有任何关于何时使用每一个的好例子,我的代码在没有的情况下也可以工作,但这篇博文指出我应该实现这些项目。
我有点困惑,正如我所说的,我想我只是将
任何帮助理解将非常感激。
编辑
这就是我现在所拥有的...它可以正常工作,但按钮并未物理禁用,只是命令没有运行,因为我返回 false。我在构造函数中调用 CanExecuteMe 以强制 RaiseCanExecuteChanged 运行 ...
这在我的视图模型的构造器中运行
1 2 3 | this.Page2Command = new RelayCommand(() => this.GoToPage2(), () => CanExecuteMe); CanExecuteMe = false; |
这是我的其余代码,我从一个示例中获取。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | private bool _canIncrement = true; public bool CanExecuteMe { get { return _canIncrement; } set { if (_canIncrement == value) { return; } _canIncrement = value; // Update bindings, no broadcast //RaisePropertyChanged(CanIncrementPropertyName); Page2Command.RaiseCanExecuteChanged(); } } public RelayCommand Page2Command { get; private set; } private object GoToPage2() { System.Windows.MessageBox.Show("Navigate to Page 2!"); return null; } |
这是我的 XAML
1 2 3 4 5 6 7 | <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="31,77,0,0" x:Name="button1" VerticalAlignment="Top" Width="75"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Page2Command, Mode=OneWay}"/> </i:EventTrigger> </i:Interaction.Triggers> </Button> |
当 Button 需要确定是否应该启用它时调用CanExecute。
Button 在绑定时执行此操作,并且在每次 CanExecuteChanged 触发后(Button 侦听此事件以获取其命令)。
所以,如果按钮应该被禁用,你应该触发 CanExecuteChanged,当按钮调用 CanExecute 时,你应该返回
命令绑定使您能够将所有按钮逻辑封装在一个实例(命令)中。 CanExecute 方法应查询应用程序的当前状态以确定是否应启用或禁用按钮。通过这种封装,您可以减少视图模型中的意大利面条式代码,这些检查在这里和那里和那里执行,我忘记了那里的那个。
您应该非常小心地使用 CanExecute 谓词。它会检查每个 UI 更改以及输入到 ANY 字段中的每个键盘键。
这可能会导致性能问题!