使用 ViewModel-First MVVM Stylet 框架时将 Views/ViewModels 添加到 ObservableCollection

Adding Views/ViewModels to an ObservableCollection when using ViewModel-First MVVM Stylet framework

当使用 ViewModel first MVVM 模式时,如何将 ViewModel 添加到 ObservableCollection 以便它们可以绑定到另一个 View 并显示为视图?

我正在使用 AvalonDock,我正在努力将 AvalonDock 中的 LayoutDocument 窗格绑定到我的视图。

我使用 Stylet 作为我的 MVVM 框架,但我也将它标记为 Caliburn-Micro,因为我假设我的问题与 MVVM 的任何 ViewModel-First 实现相关。

我的测试 ObservableCollection 填充如下:

        Documents = new ObservableCollection<LayoutDocument>();

        LayoutDocument layout1 = new LayoutDocument();
        layout1.Title = "New Document";
        UserControl1 control = new UserControl1();
        layout1.Content = control;

        LayoutDocument layout2 = new LayoutDocument();
        layout2.Title = "New Document 2";
        HomeViewModel control2 = HomeViewModel;
        layout2.Content = control2;

        LayoutDocument layout3 = new LayoutDocument();
        layout3.Title = "New Document 3";
        HomeView control3 = HomeView;
        layout3.Content = control3;


        Documents.Add(layout1);
        Documents.Add(layout2);
        Documents.Add(layout3);

UserControl1 通过代码隐藏中的 InitializeComponent() 初始化,并且工作完美。请参见下图(第一个选项卡)。

HomeViewModel 这就是我想将它们附加到 Stylet 要求的方式,这是通过构造函数带来的,AvalonDock 似乎没有将其识别为 ViewModel。它只是向 ViewModel 显示 URL。

HomeView(这是一个View)后面的代码已经被删除了,我还以为它会被Stylet初始化。该对象已通过构造函数注入。在 AvalonDock 中,它表现为未初始化的视图,因此什么也不显示。

这是构造函数:

public DockingViewModel(HomeViewModel homeViewModel, HomeView homeView)
    {
        HomeViewModel = homeViewModel;
        HomeView = homeView;
        LoadInitialTabs();
    }

我不认为问题出在 AvalonDock 上,但视图是这样绑定的。

<DockingManager.LayoutItemTemplate>
    <DataTemplate>
        <ContentControl Content="{Binding Content , FallbackValue=#ERROR Content.title#}"></ContentControl>
    </DataTemplate>
</DockingManager.LayoutItemTemplate>

请注意下图中以不同方式创建 LayoutDocuments 时的不同结果。

我怎样才能在 ViewModel 优先的方法中使用它,即使用 Stylet?

我找到了解决方案。当我使用 Stylet 时,我需要在我的视图中进行以下更改。

首先,添加 Stylet 的引用。

xmlns:s="https://github.com/canton7/Stylet"

第二:更改 DataContent 绑定自:

<ContentControl Content="{Binding Content , FallbackValue=#ERROR Content.title#}"></ContentControl>

收件人:

<ContentControl s:View.Model="{Binding Content , FallbackValue=#ERROR Content.title#}"></ContentControl>

使用 Stylet,s:View.Model 位自动从 ViewModel 中找到 View 并初始化它。 现在,我的 ObservableCollection 中除了 ViewModels 什么都不能装,而且它工作正常/