wpf - 处理应用程序范围的命令

标签 wpf mvvm

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

有一件事我完全不能理解(我关于 WPF 的书还没有到)。

我已经阅读了 Josh Smith 的文章 'WPF Apps With The Model-View-ViewModel Design Pattern' 以及他的文章 'Using RoutedCommands with a ViewModel in WPF'。

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

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

所有这一切都很好并且可以找到,但是由于我不想在我的主窗口中的菜单项(例如新建、保存等)根据我找到的 View 禁用应该启用的菜单项,我发现 Josh Smith 的关于 CommandSink 模式的文章(?)但他说它已经过时了,应该使用 RelayCommand。

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

谢谢,
文森特

最佳答案

一个简单的方法是让每个 View 都暴露一个 MenuItem 类型的属性。 ,其中包含其本地菜单。 (菜单本身可以存在于 View 的资源字典中;您只需实现一个使用 FindResource 检索它的属性 getter。)

然后让你的主菜单看起来像这样:

<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应用程序 View 模型中名为 DisabledCommand 的属性那总是被禁用的。然后将您的应用程序菜单绑定(bind)到如下命令:
public RoutedCommand SaveCustomerCommand
{
    get
    {
       CustomerView cv = SelectedView as CustomerView;
       return cv == null
          ? DisabledCommand;
          : ((CustomerViewModel)cv.DataContext).SaveCommand;
    }
}

Actor 阵容看起来有点尴尬,但除此之外,这很简单,甚至很优雅。您的应用程序 View 需要了解的有关客户 View 的唯一实现细节是有一个 SaveCommand在其 View 模型上。

关于wpf - 处理应用程序范围的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4469305/

相关文章:

c# - 使用 DataGridTemplateColumn.CellTemplate 并绑定(bind)到数据表时,DataGrid 中的重复列

c# - WPF Datagrid 单元格中 'Highlight Text' 的背景颜色

windows-phone-8 - Caliburn Micro和麦克风NullReferenceException

wpf - 从不同的 View 执行相同的命令 - MMVM

wpf - 代码和 xaml 中的 ListBox.ItemsSource 绑定(bind)

c# - 更新绑定(bind)到自定义类属性的组合框条目的最佳方法

c# - MVPVM - 使用 Interface 或 Presenter 的事件处理

javascript - AngularJS "listen"如何改变模型?

c# - ObservableCollection CollectionChanged事件问题

c# - 将 DatagridComboboxColumn 绑定(bind)到集合