我在MVVM之后创建一个WPF应用程序。在我的应用程序中我想要的是有一个视图,其中包含一些常用按钮和文本框以及TabControl
。 TabControl基本上会托管不同的UserControls
。因此,对于每个UserControl
,我都有一个单独的View
和一个ViewModel
准备就绪。
所以我的应用程序的结构看起来像这样。
MainWindow.Xaml
EntryView.Xaml
Button1
Button2
TabControl
UserControl1 (View)
UserControl2 (View)
UserControl3 (View)
我的EntryView中的儿子我有标签控件。现在我需要绑定它。
这就是我所做的。
EntryView.Xaml
<TabControl ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}">
<TabControl.ContentTemplate>
<DataTemplate DataType="{x:Type vm:UserControl1ViewModel}">
<v:UserControl1View/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:UserControl2ViewModel}">
<v:UserControl2View/>
</DataTemplate>
</TabControl.ContentTemplate>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="Header"/>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
EntryViewModel.cs
private ObservableCollection<BaseViewModel> _tabs;
public ObservableCollection<BaseViewModel> Tabs
{
get
{
if (_tabs == null)
{
_tabs = new ObservableCollection<BaseViewModel>();
_tabs.Add(new UserControl1ViewModel());
_tabs.Add(new UserControl2ViewModel());
}
return _tabs;
}
}
但现在当我运行我的应用程序时,没有事情发生。 TabControl为空。我在视图模型中将断点放在Tabs中,但它没有被击中。所以问题是我做得对吗?如果不是那我该怎么办?
答案 0 :(得分:5)
对于初学者我不知道它是如何在你的机器上编译的,因为在我的机器上它会给我这个错误:
属性“ContentTemplate”只能设置一次。
然而,当我将DataTemplates
移动到TabControl.Resources
时,它会编译并正常工作:
<TabControl>
<TabControl.Resources>
<DataTemplate DataType="{x:Type vm:UserControl1ViewModel}">
<v:UserControl1View/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:UserControl2ViewModel}">
<v:UserControl2View/>
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="Header"/>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
答案 1 :(得分:0)
真正的罪魁祸首就是那个
<TabControl.ContentTemplate>
仅将一个DataTemplate元素作为内容。该属性不能设置两次。
相反,为TabControl(或窗口)资源中的每种类型提供DataTemplate都可以。
理想情况下,在我看来,您只需将UserControlViews添加到ItemsSource,视图就可以将自己的DataContext设置为ViewModel。