1

我是 WPF 和 MVVM 的新手,我正在开发一个使用这两者的应用程序。该应用程序类似于 Windows 资源管理器,因此请考虑具有带菜单 (ShellViewModel)、树控件 (TreeViewModel) 和列表控件 (ListViewModel) 的主窗口的应用程序。我想实现Edit -> Delete之类的菜单项,它会删除当前选中的项(可能在树中或列表中)。

我正在使用 Josh Smith 的 RelayCommand,将 menuitem 绑定到 ShellViewModel 中的 DeleteItemCommand 很容易。然而,似乎实现 DeleteItemCommand 需要在 ShellViewModel 和两个子视图模型(TreeViewModel 和 ListViewModel)之间进行一些相当紧密的耦合,以跟踪焦点/选择并将操作定向到正确的子视图以进行实现。这对我来说似乎是错误的,让我觉得我错过了一些东西。

编写一个焦点管理器和/或选择管理器来记账似乎并不难,并且可以在不将类耦合在一起的情况下完成。窗口系统已经在跟踪哪个视图具有焦点,看起来我会复制代码。

我不确定如何将命令从 ShellViewModel 路由到 ListViewModel 或 TreeViewModel 以完成实际工作而不会弄乱代码。有一天,应用程序将扩展为包含两个以上的孩子,我希望 shell 尽可能不了解孩子,以使扩展尽可能轻松。

查看一些示例 WPF/MVVM 应用程序(Karl Shifflett 的 CipherText、Josh Smith 的 MVVM Demo等),我没有看到任何执行此操作的代码(或者我不明白)。

无论您是否认为我的方法偏离了基础,或者我只是错过了一个细微的差别,请分享您的想法并帮助我重回正轨。谢谢!

4

3 回答 3

1

Josh Smith 的 MVVM 实现存在一些固有问题。看看 Ward Bell 关于这个主题的帖子:http: //neverindoubtnet.blogspot.com/2010/03/mvvm-josh-smiths-way.html。您可能想看看一些替代的 MVVM 框架,例如 Caliburn,它们采用 ViewModel 优先方法并打破这种耦合。

于 2010-03-26T18:35:43.840 回答
0

RelayCommand 只是一种在 ViewModel 中获取可以绑定到 View 的命令的方法。

我想我会倾向于从所有不同的 MVVM 架构变体和示例应用程序中退后一步,而只使用良好的旧 OOD。为什么不为 TreeViewVm 和 ListViewVm 提供某种 ViewModel 基类(即 DetailsViewModelBase)。将具有与子类共享(或抽象,如果没有)一样多的实现的 CanDelete 和 Delete 方法以及 SelectedItem 放在其中。然后将 SelectedItem 绑定到类似于以下 xaml 的控件:

    <ListView AlternationCount="2" MinHeight="250" MaxHeight="400" 
          ItemsSource="{Binding Projects.View}" 
          IsSynchronizedWithCurrentItem="True"
          SelectedItem="{Binding SelectedProject, Mode=TwoWay}"
          behaviors:SelectionBehavior.DoubleClickCommand="{Binding PickCommand}"
          ItemContainerStyle="{StaticResource listingRowStyle}"
                      >

键绑定是 SelectedItem 和 IsSynchronizedWithCurrentItem。

HTH,
绿柱石

于 2010-03-26T20:38:28.757 回答
0

我发现Kent Boogaart 的一篇博客文章描述了他所谓的 ActiveAwareCommand。这似乎可以满足我的要求,尽管我还没有尝试过。对该帖子的评论提到 Prism 的 IActiveAware 具有类似的行为。

于 2010-03-27T05:34:43.020 回答