Silverlight绑定到命令

Silverlight绑定到命令,silverlight,binding,command,Silverlight,Binding,Command,有时,当我将命令绑定到ViewModel时,我的CanExecute代码并不总是被调用,因此我的按钮在应该被禁用时不会被禁用 有什么想法吗 谢谢您提到了按钮未被禁用的状态。这似乎更像是绑定问题,而不是绑定到命令。要绑定到的属性的状态是否正在更改?它什么时候改变,等等?您提到了按钮未被禁用的状态。这似乎更像是绑定问题,而不是绑定到命令。要绑定到的属性的状态是否正在更改?什么时候更改,等等?当canExecute不是第一次调用时,这是一个绑定问题 如果不是第二次自动调用,这是正常的行为 想象一下,U

有时,当我将命令绑定到ViewModel时,我的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状态在业务逻辑中发生变化时,您可以通过命令调用它,它将通知所有订阅者,在这种情况下,这是您的按钮。

当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
事件,并相应地启用/禁用该控件。