2010-12-17 76 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