2010-05-06 70 views
3

與任何MVVM WPF應用程序一樣,我有一些視圖模型。每個都有一些命令。我的視圖實現了Fluent UI(Office功能區),因此有些項目會根據應用程序的上下文而點亮。功能區是主應用程序的子項。設置來自多個視圖模型的WPF命令

我的應用程序的基本結構是它管理一個課程。一個課程有多個模塊,所以我有一個虛擬機課程&模塊...並且每個都有命令。

當應用程序加載時,我將主窗口的數據上下文設置爲課程,以便將課程命令綁定到功能區很容易,並且工作正常。

用戶開始使用模塊時遇到了挑戰。從列表中選擇模塊時,詳細信息將顯示在另一個用戶控件中。現在...我的挑戰是如何將命令連接到功能區。

我假設我可以有一些事件處理程序,它可以編程方式將當前模塊的命令連接到功能區中的所有相關控件,並在上下文消失時刪除所有內容。但是這似乎是很多不必要的工作。有沒有更乾淨的方式來做到這一點?

我想過路由命令/事件,但有人告訴我,這不起作用,因爲他們不會把所有的東西都吹到窗口並退回到功能區。

尋找一些指導在這裏...我有點MVVM(但喜歡它!)noobot!)。

回答

4

構思:介紹一個作爲服務公開的ShellCommands類。

public class ShellCommands : IShellCommands 
{ 
    public ICommand SaveCommand { get; set; } 
    ... 
} 

然後CourseViewModel和ModuleViewModel可以使用相同的服務來註冊他們的命令。

public class CourseViewModel : ViewModel 
{ 
    public CourseViewModel(IShellCommands shellCommands, ...) 
    { 
     this.ShellCommands = shellCommands; 
     ... 
    } 

    public IShellCommands ShellCommands { get; private set; } 
} 

在XAML中,你可以通過ShellCommands屬性來訪問該服務。

<MenuItem Header="Save" Command="{Binding ShellCommands.SaveCommand}"/> 

更多信息:WPF Application Framework (WAF)

+0

有趣的想法,試着讓它實現,看看這是如何工作的。我在我的MainWindow類中創建了ShellCommands對象類和一個公共屬性(因爲當應用程序加載時,它創建了CourseViewModel的一個實例並將其綁定到DataContext,然後將ShellCommands屬性傳遞給CourseViewModel。它到一個按鈕,命令不會觸發。在創建CourseViewModel後設置斷點後,我可以看到命令已經連線,但它不會觸發......同樣的命令在沒有此方法的情況下觸發(所以CanExecute想法? – 2010-05-08 11:03:26

+0

劃傷最後的評論...我在CourseViewModel上連接了一個命令,但是下游我創建了具有自己命令的ModuleViewModel實例,問題是主窗口上的ShellCommand屬性isn沒有得到這些新命令的更新,因爲它們是ModuleViewModel的新實例。似乎這將是人們經常遇到的挑戰。是否沒有普遍接受的技術解決它(或者我只是以這種錯誤的方式進行)? – 2010-05-08 11:25:27

+0

當我理解你的評論權利時,你只需要在ShellCommands上實現INotifyPropertyChanged接口。當ModuleViewModel設置命令時,ShellCommands對象引發一個PropertyChanged事件並通知WPF它必須在主窗口中更新命令綁定。 – jbe 2010-05-09 12:17:38

相關問題