【发布时间】:2012-08-15 13:19:38
【问题描述】:
我正在使用 Nuget (4.1.23.0) 上可用的当前版本的 MvvmLight,并且在单元测试中调用 RaiseCanExecuteChanged 似乎没有做任何事情。场景很简单,我有一个命令:
public RelayCommand FooCommand { get; private set; }
我在视图模型构造函数中新建它并指向一些私有方法:
FooCommand = new RelayCommand(Foo, CanFoo);
private void Foo()
{
// do some fooing.
}
private bool CanFoo()
{
return SomeRequiredProperty != null;
}
然后在 SomeRequiredProperty 的设置器中调用 RaiseCanExecuteChanged:
public object SomeRequiredProperty
{
get
{
return someRequiredProperty;
}
set
{
someRequiredProperty = value;
FooCommand.RaiseCanExecuteChanged();
}
}
现在在单元测试中,我执行以下操作:
// Arrange
var canExecuteChanged = false;
viewModel.FooCommand.CanExecuteChanged += (sender, args) => canExecuteChanged = true;
// Act
viewModel.SomeRequiredProperty = new object();
// Assert
Assert.That(canExecuteChanged, Is.True);
测试失败,因为我的事件处理程序没有触发。这是为什么呢?
更新:该行为在运行时确实有效。
【问题讨论】:
-
RaiseCanExecuteChanged方法只调用CommandManager.InvalidateRequerySuggested(),因此它不会直接引发事件。我想这会导致您的测试失败,但我不知道如何解决它。在运行时命令正在运行,对吗? -
对,这是有道理的。谢谢你。方法名称确实暗示否则嘿?我还没有将 UI 连接到这个视图模型的阶段,但是在选择框架之前我使用 MvvmLight 做了一个峰值,并且 CanExecute 功能运行良好。
-
快速连接起来以测试和更新问题。
标签: c# wpf mvvm mvvm-light relaycommand