处理应用程序范围的命

时间:2010-12-17 09:50:07

标签: wpf mvvm

我正在对WPF和MVVM进行一些研究,以评估我们是否希望在项目中实现这一点。

有一件我完全听不懂的东西(我的WPF书尚未到来)。

我已经阅读了Josh Smith的文章“使用Model-View-ViewModel设计模式的WPF应用程序”以及他的文章“在WPF中使用带有ViewModel的RoutedCommands”。

我的演示应用程序与Josh Smith的演示有些不同,因为我的菜单项没有直接绑定到主视图模型,而是由其他视图模型处理。

我的主窗口绑定到一个MainViewModel对象,该对象公开一个名为View的对象(从ViewModelBase类派生并通过ContentControl绑定到主窗口)。此View对象替换为不同的ViewModel,例如CustomerViewModel,CustomersViewModel等(这些是使用我的资源字典中定义的视图呈现的)。

所有这一切都很好找到,但由于我不想在我的主窗口中设置项目(例如New,Save等)应该启用,根据视图禁用我发现Josh Smith关于CommandSink模式的文章(?)但是他说它已经过时了,而且应该使用RelayCommand。

现在我很困惑,因为我无法弄清楚如何使用这种方法实现这个功能。

谢谢, 文森特

1 个答案:

答案 0 :(得分:0)

执行此操作的一种简单方法是让每个视图都显示类型为MenuItem的属性,该属性包含其本地菜单。 (菜单本身可以存在于视图的资源字典中;您只需实现一个使用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