首先,我是WPF的新手,特别是MVVM。我有一个窗口,其中包含不同的选项卡和一个非常大的ViewModel,其中包含每个选项卡内容的业务逻辑。我知道这不对,所以现在我想把它做得更优雅:
当我看到谷歌搜索时,一个想法是做一个“基础”视图模型的集合,它继承了每个选项卡的子视图模型,以及窗口视图模型中这个“基础”视图模型的集合。 p>
TabBaseViewModel
Tab1ViewModel inherits TabBaseViewModel
Tab2ViewModel inherits TabBaseViewModel
MainWindow ViewModel
- > Collection
TabBaseViewModel
标签内容彼此之间没有任何共同之处。
我该怎么办?
答案 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
这是一个非常简单的例子,但希望能让你开始沿着正确的轨道前进。