我正在按照 MVVM 制作 WPF 应用程序。我在我的应用程序中想要的是有一个 View ,其中包含一些常见的按钮和文本框以及一个 TabControl
。 TabControl 将基本上托管不同的 UserControls
。因此,对于每个 UserControl
,我准备了一个单独的 View
和一个 ViewModel
。
所以我的应用程序的结构看起来像这样。
MainWindow.Xaml
EntryView.Xaml
Button1
Button2
TabControl
UserControl1 (View)
UserControl2 (View)
UserControl3 (View)
我的 EntryView 中的儿子我有选项卡控件。现在我需要绑定(bind)它。
这是我所做的。
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 为空。我在 View 模型的 Tabs 中放置了断点,但它没有被击中。所以问题一是我这样做对吗?如果没有,那我该怎么办?
最佳答案
对于初学者,我不知道它如何在您的机器上编译,因为在我的机器上它给了我这个错误:
但是,当我将 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>
关于c# - 包含使用 MVVM 的不同用户控件的 TabControls,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17063014/