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



首先,我是WPF的新手,尤其是MVVM的新手。我有一个窗口,里面有不同的选项卡,还有一个很大的ViewModel,里面有每个选项卡内容的业务逻辑。我知道这是不对的,所以现在我想做得更优雅:

正如我在谷歌上看到的,一个想法是从中收集一个"基本"视图模型,继承每个选项卡的子视图模型,并在窗口的视图模型中收集这个"基本"模型。

TabBaseViewModel
Tab1ViewModel inherits TabBaseViewModel
Tab2ViewModel inherits TabBaseViewModel

MainWindow ViewModel->TabBaseViewModelCollection

选项卡中的内容彼此之间没有任何共同点。

我该怎么做?

如果使用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";
    }
}

我发布了一个不同问题的答案,它展示了如何做到这一点:如何获得ViewModel 的引用

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

相关内容

  • 没有找到相关文章

最新更新