Silverlight绑定到命令
有时,当我将命令绑定到ViewModel时,我的CanExecute代码并不总是被调用,因此我的按钮在应该被禁用时不会被禁用 有什么想法吗Silverlight绑定到命令,silverlight,binding,command,Silverlight,Binding,Command,有时,当我将命令绑定到ViewModel时,我的CanExecute代码并不总是被调用,因此我的按钮在应该被禁用时不会被禁用 有什么想法吗 谢谢您提到了按钮未被禁用的状态。这似乎更像是绑定问题,而不是绑定到命令。要绑定到的属性的状态是否正在更改?它什么时候改变,等等?您提到了按钮未被禁用的状态。这似乎更像是绑定问题,而不是绑定到命令。要绑定到的属性的状态是否正在更改?什么时候更改,等等?当canExecute不是第一次调用时,这是一个绑定问题 如果不是第二次自动调用,这是正常的行为 想象一下,U
谢谢您提到了按钮未被禁用的状态。这似乎更像是绑定问题,而不是绑定到命令。要绑定到的属性的状态是否正在更改?它什么时候改变,等等?您提到了按钮未被禁用的状态。这似乎更像是绑定问题,而不是绑定到命令。要绑定到的属性的状态是否正在更改?什么时候更改,等等?当canExecute不是第一次调用时,这是一个绑定问题 如果不是第二次自动调用,这是正常的行为 想象一下,UI应该如何知道它应该重新查询谓词?当您有一个命令参数时,它将在每次参数更改时调用谓词。通常,一些UI“事件”也会重新查询它(焦点、updatelayout等),但是并不总是(这很好,始终重新评估每个命令绑定是没有意义的)。所以你不能依赖它。您创建业务逻辑,因此您知道它何时需要更新,而不是UI。UI“无法看到谓词委托内部”并观察发生了什么。您必须通知用户界面,就像在属性更改时通知一样 ICommand有一个事件,因此您必须实现它,它是CanExecuteChanged 您应该实现一个公共方法来触发它(或者如果您使用一个框架,比如MVVMLight或Prism,它已经实现) 一个简单的实现
public void RaiseCanExecuteChanged()
{
var handler = CanExecuteChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
因此,每当您的canExecute状态在业务逻辑中发生变化时,您可以通过命令调用它,它将通知所有订阅者,在这种情况下,这是您的按钮。当canExecute不是第一次调用时,这是一个绑定问题 如果不是第二次自动调用,这是正常的行为 想象一下,UI应该如何知道它应该重新查询谓词?当您有一个命令参数时,它将在每次参数更改时调用谓词。通常,一些UI“事件”也会重新查询它(焦点、updatelayout等),但是并不总是(这很好,始终重新评估每个命令绑定是没有意义的)。所以你不能依赖它。您创建业务逻辑,因此您知道它何时需要更新,而不是UI。UI“无法看到谓词委托内部”并观察发生了什么。您必须通知用户界面,就像在属性更改时通知一样 ICommand有一个事件,因此您必须实现它,它是CanExecuteChanged 您应该实现一个公共方法来触发它(或者如果您使用一个框架,比如MVVMLight或Prism,它已经实现) 一个简单的实现
public void RaiseCanExecuteChanged()
{
var handler = CanExecuteChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
因此,每当您的canExecute状态在业务逻辑中发生变化时,您可以通过命令调用它,它将通知所有订阅者,在本例中,这是您的按钮。按钮不绑定任何内容,只有它的命令property@JaredPeless:如果控件实现ICommand,则它通常会侦听该界面上的
CanExecute
事件,并相应地启用/禁用控件。该按钮不绑定任何内容,只有它的命令property@JaredPeless:如果控件实现ICommand,那么它通常会侦听该接口上的CanExecute
事件,并相应地启用/禁用该控件。