首先,我是WPF的新手,尤其是MVVM的新手。我有一个窗口,里面有不同的选项卡,还有一个很大的ViewModel,里面有每个选项卡内容的业务逻辑。我知道这是不对的,所以现在我想做得更优雅:
正如我在谷歌上看到的,一个想法是从中收集一个"基本"视图模型,继承每个选项卡的子视图模型,并在窗口的视图模型中收集这个"基本"模型。
TabBaseViewModel
Tab1ViewModel inherits TabBaseViewModel
Tab2ViewModel inherits TabBaseViewModel
MainWindow ViewModel
->TabBaseViewModel
的Collection
选项卡中的内容彼此之间没有任何共同点。
我该怎么做?
如果使用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 的引用
这是一个非常简单的例子,但希望能让你沿着正确的轨道开始。