在开发时,我喜欢尝试理解的不仅仅是“只是这样做”。特别是对于WPF,我喜欢从GUI(xaml)和代码隐藏中理解绑定的两个方面。话虽如此,我想知道以下代码的等价物。
我有一个带有一些预定义“ICommand”实例的ViewModel,例如添加,编辑,保存,取消,退出等等 - 它们按预期工作。现在,看看有一个按钮的View(Window)的绑定,我将它绑定到命令,类似于。
<Button Command="{Binding ExitCommand}" Content="Exit" ... />
这正确地做了我期望允许表单退出(并做我正在玩的其他任何事情)。
这背后的代码背后是什么样的。我知道对于属性,例如IsEnabled或IsVisible绑定到依赖对象/属性,但是我不理解绑定到命令执行时的相关性。感谢。
答案 0 :(得分:5)
您创建命令绑定的方式与后面的代码中的任何其他绑定相同。
例如,
Binding b = new Binding();
b.Source = myViewModel;
b.Path = new PropertyPath("ExitCommand");
MyButton.SetBinding(Button.CommandProperty, b);
命令绑定期望绑定到ICommand
类型的对象。当他们执行时,例如按钮点击,他们首先调用ICommand.CanExecute()
,如果是,则调用ICommand.Execute()
。如果设置了CommandParameter
属性,那么在评估CanExecute
和Execute
对于具有Command绑定的WPF按钮,IsEnabled
属性会自动绑定到ICommand.CanExecute
的结果。首次加载按钮时,CanExecute
方法运行一次,并在命令绑定发生更改时再次运行。
如果您希望更频繁地更新,例如CommandParameter
更改时,您需要在CommandParameter
更改时连接一些额外的内容来更新绑定。我看到的大多数RelayCommands
有内置的,例如MVVM Light的RelayCommand
,但是其他命令如Microsoft PRISM的DelegateCommand
默认情况下没有这种行为。