2010-12-17 84 views
2

我正在對WPF和MVVM進行一些研究,以評估這是我們希望在項目中實現的事情。處理應用程序範圍命令

有一件事情我不明白(我的WPF書還沒有到)。

我讀過Josh Smith的文章'Model-View-ViewModel Design Pattern中的WPF應用程序'以及他的文章'在WPF中使用ViewModel中的RoutedCommands'。

我的演示應用程序與Josh Smith的演示程序稍有不同,因爲我的菜單項不直接綁定到主視圖模型,而是由其他視圖模型處理。

我的主窗口綁定到一個MainViewModel對象,該對象公開一個名爲View的對象(從ViewModelBase類派生並通過ContentControl綁定到主窗口)。這個View對象被替換爲不同的ViewModel,比如CustomerViewModel,CustomersViewModel等等(這些都是使用我的資源字典中定義的視圖呈現的:)。

所有這一切都很好找,但由於我不想在我的主窗口(如新建,保存等)中啓用應該啓用的項目,根據視圖禁用,我在CommandSink上找到了Josh Smith的文章模式(?),但他表示它已經過時,而應該使用RelayCommand。

現在我很困惑,因爲我無法弄清楚如何使用這種方法來實現這個功能。

感謝, 文森特

回答

0

一個簡單的方法來做到這一點是讓每個視圖暴露MenuItem類型的屬性,其中包含了本地菜單。 (菜單本身可以住在視圖的資源字典,你只需要實現一個屬性的getter,使用FindResource檢索它。)

然後,讓你的主菜單是這個樣子:

<Menu> 
    <MenuItem Header="File"> 
     <!-- content for your application's File menu goes here --> 
    </MenuItem> 
    <MenuItem Header="Edit"> 
     <!-- content for your application's Edit menu goes here --> 
    </MenuItem> 
    <MenuItem Header="{Binding SelectedView.MenuItem.Header}" 
      ItemsSource={Binding SelectedView.MenuItem.Items}/> 
    <MenuItem Header="Help"> 
     <!-- content for your application's Help menu goes here --> 
    </MenuItem> 
</Menu> 

編輯

我想我誤解了你的問題,但部分原因是因爲我認爲你的問題比我以爲你問的問題要容易得多。

在應用程序視圖模型中創建一個RoutedCommand屬性,該模型通常被禁用,名爲DisabledCommand。然後結合你的應用程序菜單命令是這樣的:

public RoutedCommand SaveCustomerCommand 
{ 
    get 
    { 
     CustomerView cv = SelectedView as CustomerView; 
     return cv == null 
      ? DisabledCommand; 
      : ((CustomerViewModel)cv.DataContext).SaveCommand; 
    } 
} 

鑄造是一個有點尷尬看,但除此之外,這是簡單的,優雅的,甚至。您的應用程序視圖需要了解客戶視圖的唯一實現細節是其視圖模型上有一個SaveCommand

+0

謝謝您的回覆。這與我如何使用與當前活動視圖緊密耦合的命令來做到這一點接近,並且您的示例是我如何認爲應使用RelayCommand。它並沒有'禁用'視圖不處理的命令,這是我的目標 - 而是列出了視圖可以處理的每個命令。 – Vincent 2010-12-18 10:14:54

+0

感謝您的回覆。您所描述的方法與我在WinForms應用程序中執行的方式非常相似。它給菜單系統提供了更多的控制。我想我認爲所有這一切都可以使用XAML :) – Vincent 2010-12-19 09:47:38

+0

再次嗨。我正在努力做出一個好的解決方案,我不確定我還在那裏。在你的代碼示例中,你檢查一個CustomerView。您可能指的是CustomerViewModel,但除此之外。這種方法需要對每個支持Save命令的ViewModel進行轉換。目前我正在嘗試使用CommandSink(Josh Smith)來完成這項工作,但由於它'已過時',所以我不確定... – Vincent 2010-12-20 21:05:58