2010-02-11 107 views
3

我有一個複合WPF應用程序。我打算實施工具欄功能。很少有工具欄項目(基本上是打印,保存,隱藏,展開,撤消),這對於主要區域中的所有視圖都是通用的。爲此,我創建了默認工具欄模塊,它將這些項目(打印,保存,隱藏,展開,撤消)添加到工具欄區域。當用戶單擊任何工具欄項目時,需要由主區域中的所有20個視圖來處理。wpf棱鏡複合命令

對於每個工具欄項目,我都關聯了一個prism delegatecommand對象。

樣品:

private ICommand _printCommand; 

public ICommand PrintCommand 
{ 
    get 
    { 
     if (_printCommand == null) 
     { 
      _printCommand = 
       new DelegateCommand<object>(**Print**, **CanPrint**);      
     } 

     return _printCommand; 
    } 
} 

XAML中,結合工具欄項到該命令。

在主要區域,我們顯示近20個視圖。所有這些視圖都必須包含這個命令。我正在考慮使用事件聚合器來發佈一個事件,並且所有的視圖都會記錄這個事件。

對於前: 當用戶點擊打印,打印命令執行打印方法,將發佈打印事件。本次活動將提供20個視圖並進行進一步處理。

我在正確的方式實施工具欄?

+0

你希望打印所有視圖,還是隻打印當前視圖,例如,帶輸入焦點的視圖? – 2010-02-12 12:43:03

+0

對於打印,我想用輸入焦點打印視圖。但是,對於保存和展開,它應該適用於所有視圖 – Praveen 2010-02-12 13:51:22

回答

0

我不太喜歡這樣的事情使用EventAggregator太多的想法。特別是如果您決定創建一個多文檔編輯器界面,您的每個編輯人員都將負責進行大量篩選,以獲取僅適用於他們的事件。

爲此目的使用EventAggregator可能很容易,但我認爲它可能不是真正合適的。也就是說,這並不是真的錯......事實上,我相信一些棱鏡樣本完全可以做到這一點,但我認爲它會對組成部分進行過濾的責任過大,而不是利用框架功能。

您的主題建議您正在考慮爲此使用CompositeCommands。是否有任何理由你不這樣做,而不是使用EventAggregator?如果你有一個標準的地方ViewModels可以註冊他們的命令來處理每個按鈕,每個按鈕後面都有一個複合命令,那麼這不會給你想要的功能嗎?除了能夠處理按鈕命令之外,每個組成視圖/視圖模型將能夠在不合適的按鈕時禁用按鈕等。

仔細查看Prism文檔中的CompositeCommand示例,並查看是否他們不做你想做的事。

2

我最初想到使用複合命令。但通過查閱文件可能不符合我的要求。

例如:應用程序支持40個視圖 主區域 - > 20視圖是活動的,所有視圖模型都是從baseview模型派生的。

工具欄 - >保存按鈕 - >數據綁定到compositesaveallcommand(啓用activeaware監視器) baseviewmodel - >保存命令 - >寄存器/基於特定篩選條件compositesaveallcommand

當用戶點擊保存按鈕,compositesaveallcommand查找註銷所有註冊的活動命令,並檢查所有註冊的viewmodel命令調用(canexecute方法,並且所有註冊的命令需要返回true),然後調用子命令(執行方法)。

但在我的情況下,如果用戶在單個視圖中進行修改,其餘19個視圖沒有修改。但是我想爲單個視圖執行保存。看起來複合命令不會調用註冊的comamnds,除非它可以執行所有的命令。

+0

是的,在這種情況下,您希望使用複合命令旁邊的命令。看看「Save/Save All」的棱鏡樣品,​​我不記得它是哪一個,但我認爲這就是你要找的。它使用常規命令進行保存併爲複合命令使用全部保存。 此外,如果您對答案有回覆,請使用「評論」功能或更新您的答案,而不是發佈其他答案。 – 2010-02-15 15:13:55

1

這正是CompositeCommand所做的。我相信沒有任何例子(指揮快速啓動或指揮官不再顯示積極的意識活動,他們在Prism v1中),但如果你使用主動意識的東西,你會得到你所要求的。 唯一的問題是,您需要確保每個單獨的DelegateCommand在應該(即視圖被激活時)都正確更新其IsActive屬性。

2

如果應用程序允許用戶同時執行多個命令,我們可能希望允許用戶使用由功能區按鈕表示的單個命令將所有項目保存在不同的選項卡上。在這種情況下,全部保存命令將爲每個項目調用由視圖模型實例實現的每個保存命令。 例如,在股票交易者RI中,每個買賣訂單的提交和取消命令都通過SubmitAllOrders和CancelAllOrders複合命令註冊,如以下代碼示例所示(請參閱OrdersController類)。

commandProxy.SubmitAllOrdersCommand.RegisterCommand(
        orderCompositeViewModel.SubmitCommand); 
commandProxy.CancelAllOrdersCommand.RegisterCommand(
        orderCompositeViewModel.CancelCommand); 

上述commandProxy對象提供了對靜態定義的Submit和Cancel複合命令的實例訪問。有關更多信息,請參閱類文件StockTraderRICommands.cs。

public class MyViewModel : NotificationObject 
{ 
    private readonly CompositeCommand saveAllCommand; 

    public ArticleViewModel(INewsFeedService newsFeedService, 
          IRegionManager regionManager, 
          IEventAggregator eventAggregator) 
    { 
     this.saveAllCommand = new CompositeCommand(); 
     this.saveAllCommand.RegisterCommand(new SaveProductsCommand()); 
     this.saveAllCommand.RegisterCommand(new SaveOrdersCommand()); 
    } 

    public ICommand SaveAllCommand 
    { 
     get { return this.saveAllCommand; } 
    } 
}