- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 WPF 中采用了 MVVM 模式,并且已经学会了 Command
的使用。 .但在我的实现中,我分配的委托(delegate)来实现 CanExecute
总是被调用。我的意思是,如果我在委托(delegate)函数中放置一个断点,则表明该函数不断被调用。根据我的理解(也是一种自然的思维方式,但我当然可能是错的),只有当我以某种方式通知状态更改时才会调用该委托(delegate),而那是 CommandManager
(重新)检查 CanExecute
属性并修改IsEnabled
UI 元素的属性。
这是我最初从 C# 版本获得的 VB.NET 实现。我确实注意到我需要对移植的代码进行一些更改才能编译它。会不会是 C# 和 VB.NET 的底层不同?那么有人可以为我提供一个原始的 VB.NET 实现,或者如果我正确理解了 Command 行为,可以指出什么是错误的或做什么?
这是我的 VB.NET 版本:
Public Class CommandBase
Implements ICommand
Public Property ExecuteDelegate() As Action(Of Object)
Public Property CanExecuteDelegate() As Predicate(Of Object)
Public Sub New()
End Sub
Public Sub New(execute As Action(Of Object))
Me.New(execute, Nothing)
End Sub
Public Sub New(execute As Action(Of Object), canExecute As Predicate(Of Object))
If execute Is Nothing Then
Throw New ArgumentNullException("execute")
End If
ExecuteDelegate = execute
CanExecuteDelegate = canExecute
End Sub
Public Function CanExecute(parameter As Object) As Boolean Implements ICommand.CanExecute
Return If(CanExecuteDelegate Is Nothing, True, CanExecuteDelegate(parameter))
End Function
Public Custom Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged
AddHandler(ByVal value As EventHandler)
If CanExecuteDelegate IsNot Nothing Then
AddHandler CommandManager.RequerySuggested, value
End If
End AddHandler
RemoveHandler(ByVal value As EventHandler)
If CanExecuteDelegate IsNot Nothing Then
RemoveHandler CommandManager.RequerySuggested, value
End If
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CommandManager.InvalidateRequerySuggested()
End RaiseEvent
End Event
Public Sub Execute(parameter As Object) Implements ICommand.Execute
If ExecuteDelegate IsNot Nothing Then ExecuteDelegate.Invoke(parameter)
End Sub
Public Sub RaiseCanExecuteChanged()
CommandManager.InvalidateRequerySuggested()
End Sub
End Class
MyCommand = New CommandBase(AddressOf CommandExec, AddressOf CanExecuteExec)
Private Function CanExecuteExec(obj As Object) As Boolean
CanExecuteExec
一直被调用。我猜它效率低下,想象一下我有数百个
Command
对象和大部分
CanExecute
其中大部分时间都不会改变。
CanExecute
确实一直被调用,而其他人则相反。我不是这方面的专家,但我不得不说第二种意见听起来更自然,对我来说更有意义。虽然我仍然需要弄清楚这是否属实,但为什么 WPF 一直检测到更改以便它不断检查
CanExecute
最佳答案
在您的 CanExecuteDelegate
你有钩到CommandManager.RequerySuggested
.
所以,每当CommandManager.RequerySuggested提高你的CanExecuteDelegate
将被调用。
CommandManager.RequerySuggested event is raised whenever changes to the command source are detected by the command manager which ranges from Keyboard.KeyUpEvent, Mouse.ClickEvent etc.
InvalidateRequerySuggested
这会强制 CommandManager 引发 RequerySuggestedEvent。因此,您也可以调用它来手动验证您的命令。
CanExecute
只有当您明确调用
RaiseCanExecuteChanged()
时,才会调用委托(delegate)。委托(delegate)命令公开的方法。
Breakpoint is hitting every time on turning to VS since CommandManager RequerySuggested event gets called on lost focus of window and on activation property changed of window. That's why you notice that breakpoint is hitting every now and then when you move to VS since focus moves from WPF window to Visual Studio.
关于wpf - 更新标题 : Why ICommand. CanExecute 一直被调用,而不是像事件一样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18962189/
我有一个在 Android 市场上相当流行的应用程序,它允许数以万计的用户按下一个按钮并向它发出语音命令。然后我就可以做很多不同的事情,比如给他们提供当前的天气预报等等...... 无论如何,我的应用
令人惊讶的是,标题基本上解释了它。我们有一个我们的客户制作的页面,我们正在重新创建该页面。 页面高度会一直增加,直到(我假设是这样)浏览器达到它的极限。我已经尝试过 Firebug 和 W3 验证器,
我是 react-native 的新手,试图创建我自己的组件,但它一直显示一个空屏幕。 这是我的组件代码 class BoxComponent extends Component { cons
我正在为我的 PHP 元素创建一个非常简单的博客,但遇到了一个简单的问题。我无法让我的页眉图像一直 float 。我有一个横幅,左边有一些文字,我有一个 1px 的切片,在可以选择的任何分辨率的宽度上
为什么我可以在另一个 Controller 的 View 中访问一个 Controller 的辅助方法?有没有办法在不破解/修补 Rails 的情况下禁用它? 最佳答案 @George Schreib
我正在使用带有最新 ADT 插件的 Eclipse Kepler SP2。每隔一分钟 Eclipse 就会说“为 Android 4.4.2 加载数据”并阻止我想做的一切。我在不同的文件夹中有几个 E
我是一名优秀的程序员,十分优秀!