我在Silverlight中遇到的一个主要问题是缺乏强大的命令支持(ala WPF)。更具体地说,由于需要在任何可能影响Command状态的属性上手动调用RaiseCanExecuteChanged(),我发现很难干净地应用MVVM模式并使用合理的封装。
例如,我有一个父/子View绑定到父/子ViewModel。父视图绑定到父ViewModel上的命令。父视图有多个子视图,每个子视图都是一个usercontrol,包含一系列内置控件(文本框,组合框等),这些控件绑定到子视图模型。
父命令的状态(即,它是否可以执行)基于每个子控件的状态。例如,所有子用户控件的所有文本框都必须具有有效值。这需要这些控件绑定每个调用RaiseCanExecuteChanged()的属性,这意味着他们必须知道ICommand本身或调用RaiseCanExecuteChanged()方法的委托。
注入命令或委托对我来说感觉不对,特别是在比上述更复杂的情况下,例如当有3层以上的控件时,这些引用需要一直传递到链中。这也是一些内务管理,因为每次实例化一个孩子时,都必须采取额外的步骤来添加命令或委托。
如果Silverlight支持CommandManager.RequerySuggested功能,就像WPF那样,这一切都会变得更加简单。
我看过一些文章表明可以在Silverlight中实现RequerySuggested(one such article),但很少看到它是否可靠并且表现充分。
其他人如何使用Silverlight解决此限制?
答案 0 :(得分:4)
我过去使用的一种方法是使用Laurent Bugnion的MVVM Light框架(http://blog.galasoft.ch/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx)中的消息传递引擎。
本质上,孩子们发送消息来请求命令是必需的。侦听器可以位于父节点中,响应消息并调用RaiseCanExecuteChanged()。
我发现MVVM Light仅适用于消息传递引擎。虽然您必须小心并在处理父视图时取消注册侦听器。
希望有所帮助。