我正在使用MVVM-Light,我的继电器命令工作正常,我刚刚读到我应该实现CanExecuteChanged
和CanExecute
。虽然我找不到一个好的例子。
有没有人有一个如何实现这些的好例子。
CanExecute在无法执行时需要返回False,但不会只是取消按钮吗?
我何时执行CanExecuteChanged
?
任何人都有任何关于何时使用每个代码的好例子,我的代码只能在this blog帖子中说明我应该实现这些项目。
我有点困惑,因为我说我以为我只是将Enabled
属性绑定到ViewModel中的属性,所以我可以禁用按钮或类似的控件?
理解上的任何帮助都会非常感激。
修改
这就是我现在所拥有的...它正在工作,但按钮不是物理禁用只有命令不运行,因为我返回false。我在构造函数中调用CanExecuteMe来强制RaiseCanExecuteChanged运行...
这在我的viewmodel
的construtor中运行 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>
答案 0 :(得分:10)
当Button需要确定是否应该启用时,会调用CanExecute。
Button在绑定时执行此操作,并在每次触发CanExecuteChanged之后(Button会为其命令侦听此事件)。
因此,如果应该禁用该按钮,则应该触发CanExecuteChanged,当按钮调用CanExecute时,您应该返回false
。这是使用命令绑定时启用/禁用按钮的首选方法。
命令绑定使您能够封装实例(命令)中的所有按钮逻辑。 CanExecute方法应查询应用程序的当前状态,以确定是应启用还是禁用该按钮。通过这种封装,您可以减少视图模型中的意大利面条代码,这些代码在这里和那里进行,然后在那里我忘了那个。
答案 1 :(得分:1)
使用CanExecute谓词时应该非常小心。它会检查每个UI更改以及输入任何字段的每个键盘键。
这可能会导致性能问题!