【问题标题】:MVVM alternate events patternMVVM 交替事件模式
【发布时间】:2011-08-11 16:04:57
【问题描述】:

我目前有一个看起来像这样的层次结构

MainWindowViewModel
    TabViewModel
        EditorViewModel
            ReviewingServices
                ConflictFinder

我遇到的问题是TabViewModel 想要收到冲突通知(来自ReviewingServices)以及其他事情。我可以为我的所有依赖项创建公共 getter,并使用DependencyA.DependencyB.DependencyC += SomeHandler; 订阅我想要的任何内容,但这相当混乱。我发现自己创造了太多我想计算的事件。本质上,我创建了一个混乱的事件网络。我喜欢我为每个班级创建的职责分离,但是当每个班级都有 2-3 个事件时,维护起来相当困难。如果订阅者仅高于 1 级,我在创建和维护事件时没有问题。当说MainWindowViewModel 希望收到新评论的通知时(从ReviewingServies 发布。

如果订阅者希望订阅深深嵌套在应用程序中的事件,那么执行这些类型的事件是否更好?

【问题讨论】:

    标签: c# wpf events mvvm


    【解决方案1】:

    我不知道我是否真的遇到了你的麻烦,但我建议看看某种事件聚合器。尝试查看Caliburn one,但自己实现一个并没有什么不同。这样,您可以使用类型命名事件并从任何地方订阅它。

    【讨论】:

      【解决方案2】:

      尝试使用 Microsoft Prism 及其事件聚合器

      【讨论】:

        【解决方案3】:

        链接DependencyA.DependencyB.DependencyC 通常被认为破坏了Law of Demeter(您实际上是依赖于依赖项的依赖项等)。

        我最近解决了一个类似的设计问题,方法是使用由 IMyOperationNameContext 等接口定义的 Mediator,它允许我将两个 ViewModel 的组合上下文与/注入到使用第三个 ViewModel 的 WinForms 控件和所有这些都无需将三个模型直接耦合在一起。

        类似这样(注意示例中IAlbumContext 更多地充当代理,但这只是因为示例被简化了):

        interface IAlbumContext
        {
            public AlbumInfo SelectedAlbum { get; set; }
        }
        
        class AlbumContext
        {
            AlbumSelectionViewModel _model;
        
            public AlbumContext(AlbumSelectionViewModel model)
            {
                _model = model;
            }     
        
            public Album SelectedAlbum {
                get { return _model.Album; }
            }
        }
        
        class PhotoUploadDialog : Dialog
        {
            public PhotoUploadDialog(IAlbumContext context, PhotoUploadViewModel viewModel)
            {
            }
        }
        

        虽然此解决方案对我有用,而且我喜欢它具有高内聚性和解耦性,但它最终无法大规模扩展(例如,此类上下文接口的数量可能会根据应用程序快速增长)。然而,使用更通用的解决方案的代价是代码变得更难遵循。

        【讨论】:

          猜你喜欢
          • 2013-02-08
          • 2023-03-28
          • 2020-05-30
          • 1970-01-01
          • 1970-01-01
          • 2013-05-01
          • 1970-01-01
          • 2010-12-15
          • 1970-01-01
          相关资源
          最近更新 更多