Dav*_*ave 23 data-binding wpf command mvvm
我的应用程序是使用WPF中的MVVM模式编写的,我的所有Buttons都使用Command绑定来执行模型中的代码.所有命令都在CanExecute中具有代码,以确定绑定Button的Enabled状态.逻辑运行完美,但在所有情况下,除非我点击GUI中的其他位置,否则GUI将保持禁用状态.
例如,我有一个名为Discard Candy的按钮.当我单击此按钮时,它会在线程池线程中启动一个进程,该进程将名为Running的bool属性设置为true.由于Discard Candy命令的CanExecute方法看起来像这样
public bool CanExecute(object parameter)
{
return !Running;
}
Run Code Online (Sandbox Code Playgroud)
一旦过程开始,该按钮将被禁用.问题是当进程完成时,Running会设置为false,但GUI不会更新,即Discard Candy不会重新启用.
但是,如果我点击GUI中的任何位置,例如在窗口或标题栏上,则会立即启用Discard Candy按钮.所以逻辑是有效的,但事情正在发生,我只是不明白.有人可以向我解释一下这种行为吗?
编辑 - 到目前为止,它听起来像CommandManager.InvalidateRequerySuggested没有帮助人.我打算试一试,但此刻我有点担心.我确实按照推荐的链接,这样做决定阅读更多有关MVVM光工具包的信息.这听起来很不错 - 有没有人在这里使用它并且能够确认它没有表现出我到目前为止看到的问题?虽然我计划在下一个主要版本中尝试MVVM轻型工具包.我的应用程序,我不想重做我目前所有的命令,这就是为什么我可能会开始使用CommandManager.InvalidateRequerySuggested,所以我们都可以在这里得到另一个关于它的用处的数据点.
编辑#2 - 非常有趣,MVVM light工具包实际上依赖于CommandManager.InvalidateRequerySuggested以支持UI禁用/重新启用命令的能力.作者说:
"严格地说,在WPF中,如果你的命令绑定到CommandManager监视的控件,你不必自己引发CanExecuteChanged事件.你可以让CommandManager处理这种情况.也就是说,外部事件可能还可以改变UI的状态.假设UI应该从上午9点到下午5点启用,然后在晚上禁用.用户没有触发UI,所以代码应该(礼貌地)请求CommandManager重新查询状态命令.这是通过调用InvalidateRequerySuggested CommandManager上的方法实现的.正如你猜到了,RelayCommand类的方法RaiseCanExecuteChanged做到了这一点. "
Cam*_*and 21
WPF不会更新命令绑定控件,除非它有理由.单击GUI会导致WPF刷新,因此更新可以正常工作.
您可以通过调用手动刷新任何命令绑定控件CommandManager.InvalidateRequerySuggested.
我的问题似乎与命令绑定有关 - 我RelayCommand经常使用命令绑定,但按钮的渲染在我单击窗口之前并不正确。
从 中删除CanExecute代码CommandBinding并使用IsEnabled属性反而解决了我的问题,而没有头痛 - 只是花了很长时间,直到我在许多其他可能成为问题的事情中尝试了这一点。
| 归档时间: |
|
| 查看次数: |
8085 次 |
| 最近记录: |