WPF:使用MVVM模式进行Tabcontrol的正确方法

时间:2013-07-26 07:15:08

标签: wpf mvvm viewmodel tabcontrol

首先,我是WPF的新手,特别是MVVM。我有一个窗口,其中包含不同的选项卡和一个非常大的ViewModel,其中包含每个选项卡内容的业务逻辑。我知道这不对,所以现在我想把它做得更优雅:

当我看到谷歌搜索时,一个想法是做一个“基础”视图模型的集合,它继承了每个选项卡的子视图模型,以及窗口视图模型中这个“基础”视图模型的集合。 p>

TabBaseViewModel
Tab1ViewModel inherits TabBaseViewModel
Tab2ViewModel inherits TabBaseViewModel

MainWindow ViewModel - > Collection

TabBaseViewModel

标签内容彼此之间没有任何共同之处。

我该怎么办?

2 个答案:

答案 0 :(得分:3)

您应该考虑using an MVVM framework if you're using 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";
    }
}

答案 1 :(得分:0)

我发布了一个不同问题的答案,该问题说明了如何做到这一点:How to Get a Reference to a ViewModel

这是一个非常简单的例子,但希望能让你开始沿着正确的轨道前进。