WPF:使用MVVM模式正确地实现TabControl的方法

4

首先,我是WPF和MVVM的新手。我的窗口有不同的选项卡和一个非常大的ViewModel,包含每个选项卡内容的业务逻辑。我知道这样做不对,所以现在我正在尝试更优雅的方式:

根据我通过谷歌搜索所得的经验,在"基础" ViewModel 集合中继承每个选项卡的子 ViewModel,然后在窗口 ViewModel 中对这个 "基础" ViewModel 集合进行集合。

TabBaseViewModel
Tab1ViewModel inherits TabBaseViewModel
Tab2ViewModel inherits TabBaseViewModel

MainWindow ViewModel --> TabBaseViewModelCollection

每个选项卡的内容彼此之间没有共同点。

我应该如何进行?

2个回答

3
你如果在使用MVVM,应该考虑 使用MVVM框架。例如,使用Caliburn.Micro,你可以把主视图定义如下:
<TabControl x:Name="Items">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DisplayName}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

数据上下文是一个具有集合的Conductor类型。 Items 属性将公开视图模型的集合:
public class MainViewModel : Conductor<IScreen>.Collection.OneActive
{ 
    private OneOfMyViewModels oneOfMyViewModels;

    private AnotherViewModel anotherViewModel;

    protected override void OnInitialise()
    {
        // Better to use constructor injection here
        this.oneOfMyViewModels = new OneOfMyViewModels();
        this.anotherViewModel = new AnotherViewModel();

        this.Items.Add(this.oneOfMyViewModels);
        this.Items.Add(this.anotherViewModel);
    }

    protected override void OnActivate()
    {
        base.OnActivate();
        this.ActivateItem(this.oneOfMyViewModels);
    }
}

public class OneOfMyViewModels : Screen
{
    public OneOfMyViewModels()
    {
        this.DisplayName = "My First Screen";
    }
}

好的,但是那时我几乎已经独立开发了整个应用程序,没有使用任何框架。我尝试过Prism和MVVMLight,但一开始我觉得有点困难,所以我尝试逐步构建基本架构并逐步编写类,而不使用任何工具。 - Oscar Mateu
这对于学习练习很有用,但是除非你愿意花费大量的精力去实现已经由其他人高标准实现的东西,否则你最终会想要一个框架。 - devdigital
如果您想将一组视图模型类型绑定到TabControl,请查看https://dev59.com/zG035IYBdhLWcg3wC7mf。 - devdigital
这正好是我推荐的相反... 我的意思是 mvvm 框架,尤其是 Caliburn. - Liero

0

我在另一个问题的答案中提供了如何实现这一点的示例:如何获取ViewModel的引用

这是一个非常简单的示例,但希望能让你朝着正确的方向开始。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接