Mvvm CanExecute和CanExecuteChanged,我必须用RelayCommand实现这些?
我正在使用MVVM Light,我的中继命令工作得很好,我刚刚读到我应该实现Mvvm CanExecute和CanExecuteChanged,我必须用RelayCommand实现这些?,mvvm,mvvm-light,relaycommand,canexecute,Mvvm,Mvvm Light,Relaycommand,Canexecute,我正在使用MVVM Light,我的中继命令工作得很好,我刚刚读到我应该实现CanExecuteChanged和CanExecute。虽然我找不到一个好的例子 有没有人有一个很好的例子来说明如何实现这些 CanExecute在无法执行时需要返回False,但不只是取消按钮 何时执行CanExecuteChanged 任何人都有任何关于何时使用每一项的好例子,我的代码在没有任何说明的情况下工作,但是post声明我应该实现这些项目 我有点困惑,正如我所说,我想我应该将Enabled属性或其他东西绑定
CanExecuteChanged
和CanExecute
。虽然我找不到一个好的例子
有没有人有一个很好的例子来说明如何实现这些
CanExecute在无法执行时需要返回False,但不只是取消按钮
何时执行CanExecuteChanged
任何人都有任何关于何时使用每一项的好例子,我的代码在没有任何说明的情况下工作,但是post声明我应该实现这些项目
我有点困惑,正如我所说,我想我应该将Enabled
属性或其他东西绑定到ViewModel中的属性,以便禁用按钮或类似控件
任何有助于理解的帮助都将不胜感激
编辑
这就是我现在拥有的。。。它正在工作,但按钮并没有被物理禁用,只是命令没有运行,因为我返回false。我正在调用构造函数中的CanExecuteMe以强制运行RaiseCanExecutChanged
这在我的viewmodel的构造函数中运行
this.Page2Command = new RelayCommand(() => this.GoToPage2(), () => CanExecuteMe);
CanExecuteMe = false;
下面是我的代码的其余部分,我从一个示例中获取
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
<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>
当按钮需要确定是否应启用时,将调用CanExecute 该按钮在绑定时执行此操作,每次CanExecuteChanged激发后(该按钮侦听此事件以获取其命令) 因此,如果该按钮应被禁用,则应激发CanExecuteChanged,当该按钮调用CanExecute时,应返回
false
。这是使用命令绑定时启用/禁用按钮的首选方法
命令绑定使您能够将所有按钮逻辑封装在一个实例(命令)中。CanExecute方法应查询应用程序的当前状态,以确定按钮应启用还是禁用。通过这种封装,您减少了视图模型中的意大利面代码,在视图模型中,这些检查在这里、那里和那里执行,我忘记了下面的检查。您应该非常小心地使用CanExecute谓词。它检查每个用户界面的变化和输入任何字段的每个键盘键
这可能会导致性能问题 谢谢威尔,好的,我已经让它工作了,并且确保按钮不会执行,因为它返回false。但按钮“仍然”启用。。。我将用我的代码更新我的问题。。也许我做错了什么。好吧,找到它,我必须设置一个名为MustToggleIsEnabledValue的属性。。我将把这个问题标记为已回答,因为这个回答基本上回答了我的问题。@Martin你应该在问题编辑中添加关于MustToggleIsEnabled的内容,我刚刚花了一个小时试图弄清楚