【问题标题】:In MVVM Controller doesn't exist physically ? Doesn't this violate the Separation of Concerns Principle?在 MVVM 控制器中物理上不存在?这不违反关注点分离原则吗?
【发布时间】:2011-04-10 13:17:29
【问题描述】:

看不到

http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx

如果控制器与视图模型混合,你想如何分离关注点?控制器并不仅限于数据绑定,还有命令。

我的意思是,如果 MVVM 也具有控制器的职责,那么这种设计就违反了关注点分离的原则。维护视图状态和编排视图和模型的逻辑显然是两个应该分开的大任务,这就是 MVC C 背后的原因

如果我想拥有一个单独的控制器怎么办:WPF 和 silverlight 首先加载 GUI 而不让不可见的类像控制器一样先加载然后管理视图和模型会有多难?

【问题讨论】:

  • 这不就是 ViewModel 充当 MVVM 中的 Controller 吗?
  • 我的观点是它不应该:它违反了关注点分离的原则。维护视图状态和编排视图和模型的逻辑显然是两个应该分开的大任务,这就是 MVC C 背后的原因

标签: wpf silverlight architecture frameworks


【解决方案1】:

您不是从 MVC 模式的角度来看这个,而不是从关注点分离的角度来看这个吗?在我看来,您的问题将 MVVM 与 MVC 进行了比较。

MVVM 有不同的方法:视图优先、视图模型优先和婚姻类型。我的婚姻类型你可以有另一个将这些 View 和 ViewModel 结合起来的类。上述类首先加载,然后实例化 View 和 ViewModel,然后将两者结合。

public class SomeScreen : ScreenBase, IScreen
    {
        [Import(typeof(ISomeViewModel))]
        public IViewModel ViewModel
        {
            get { return this.GetPropertyValue(ApplicationProperties.ViewModel); }
            set {
                this.SetPropertyValue(ApplicationProperties.ViewModel, value);
                RaisePropertyChanged(ApplicationProperties.ViewModel);
            }
        }

        #region Constructor
        public MainScreen()
        {
            CompositionInitializer.SatisfyImports(this);
        }
        #endregion

        #region Methods
        public override IView GetViewToDisplay()
        {
            IView view = new MainView();
            //Or maybe have a mechanism here based on settings which view to pair up with this.
            view.ViewModel = this.ViewModel;
            this.ViewModel.View = view;
            return view;
        }
        #endregion
    }

在此示例中,它们之间将完全分离,并且由于接口而没有依赖关系,您也可以向屏幕/控制器添加大量功能。

【讨论】:

  • 您不是从 MVC 模式的角度来看这个,而不是从关注点分离的角度来看这个吗?不,因为原始 MVC 确实关心关注点分离,而 MVVM 实现确实将控制器的某些部分与视图和模型视图混合在一起,因为 GUI 是一等公民而不是模型。但是感谢您的示例代码:是的,我更喜欢婚姻类型。
  • 我明白了...一定有点误解了你的问题。希望代码有所帮助。 :)
猜你喜欢
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
相关资源
最近更新 更多