【问题标题】:Setting DataContext to multiple sources while respecting MVMM在尊重 MVMM 的同时将 DataContext 设置为多个源
【发布时间】:2020-05-22 12:32:10
【问题描述】:

我已经阅读了与此类似的问题的其他问题,但它并没有完全要求解决这个简单场景:

namespace View
{
    /// <summary>
    /// Interaction logic for PuzzleSelectionScreen.xaml
    /// </summary>
    public partial class PuzzleSelectionScreen : Page
    {
        public PuzzleSelectionScreen(PuzzleControllerVM puzzleControllerVM, ScreenSwitcher screenSwitcher)
        {
            InitializeComponent();

            // My button needs a command in screenSwitcher (View) to change Page ..
            // .. with a Property (puzzle data) from puzzleControllerVM (View Model)
            this.DataContext = puzzleControllerVM;
            this.DataContext = screenSwitcher;
        }
    }
}

我可以将screenSwitcher 粘贴在puzzleControllerVM 中并仅通过this.DataContext = puzzleControllerVM; 访问所有属性,但这会违反MVMM,因为screenSwitcher 包含许多视图对象。

我在上面所做的,DataContext 将分配给screenSwitcher,只是因为它最后执行,但我想要一个方便的解决方案,这样我的 DataContext 就可以访问这两个源,而不必将我的 screenSwitcher 粘贴在我的查看模型类PuzzleControllerVM

【问题讨论】:

  • 创建两个构造函数。一个有参数PuzzleControllerVM,一个有参数ScreenSwitcher,
  • 听起来 PuzzleSelectionScreen View / VM 应该是 ScreenSwitcher View / VM 的子项
  • 为什么ScreenSwitcher“包含许多视图对象”? 违反了 MVVM 模式。切换屏幕应该是视图模型的一部分,并且不包括任何视图对象。

标签: c# wpf data-binding datacontext


【解决方案1】:

你可以创建一个新类型,它持有对两者的引用并将数据上下文设置为该类型的实例。

类似的东西

    public PuzzleSelectionScreen(PuzzleControllerVM puzzleControllerVM, ScreenSwitcher screenSwitcher)
    {
        InitializeComponent();
        this.DataContext = new Hybrid { PuzzleControllerVM = puzzleControllerVM, ScreenSwitcher = screenSwitcher };
    }

    public class Hybrid
    {
       public PuzzleControllerVM PuzzleControllerVM { get; set; }
       public ScreenSwitcher ScreenSwitcher { get; set; }
    }

【讨论】:

    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多