2011-01-05 47 views
3

我在Silverlight中遇到的一個主要問題是缺乏強大的指令支持(ala WPF)。更具體地說,由於需要在可能影響命令狀態的任何屬性上手動調用RaiseCanExecuteChanged(),所以我發現很難清楚地應用MVVM模式並使用合理的封裝。Silverlight 4:可靠的指令與Requery支持的功能?

作爲一個例子,我有父/子視圖綁定到父/子ViewModel。父視圖綁定到父視圖模型上的命令。父視圖具有多個子視圖,每個子視圖都是一個包含一系列內置控件(文本框,組合框等)的用戶控件,這些控件綁定到子視圖模型。

父命令的狀態(即它是否可以執行)是基於每個子控件的狀態。例如,所有child usercontrols的所有文本框都必須具有有效值。這需要這些控件綁定每個調用RaiseCanExecuteChanged()的屬性,這意味着他們必須具有ICommand本身的知識或調用RaiseCanExecuteChanged()方法的委託。

注入命令或委託給我感覺不對,特別是在比上面描述的情況更復雜的情況下,例如當有3層以上的控件時,這些引用需要一直傳遞到鏈中。這也是一個更多的內務管理,因爲每次孩子被實例化時,都必須採取額外的步驟來添加命令或委託。

如果Silverlight支持像WPF那樣的CommandManager.RequerySuggested功能,這將會變得更加簡單。

我看過一些文章,提示可以在Silverlight中實現RequerySuggested(one such article),但很少有關於它是否可靠且性能充分的評論。

其他人如何使用Silverlight解決這個限制?

回答

4

我過去使用的一種方法是使用Laurent Bugnion的MVVM Light框架(http://blog.galasoft.ch/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx)的消息傳遞引擎。

本質上,孩子們發送信息要求命令是必需的。監聽器可以坐在父代中,對消息作出響應並調用RaiseCanExecuteChanged()。

我發現MVVM Light只是爲了消息傳遞引擎才值得。儘管在處理父視圖時,您必須小心並取消註冊偵聽器。

希望有所幫助。