3

我正在制作一个遵循 MVVM 的 WPF 应用程序。我在我的应用程序中想要的是有一个包含一些常用按钮和文本框的视图以及一个TabControl. TabControl 基本上会承载不同的UserControls. 所以对于每一个UserControl我都有一个单独View的和ViewModel准备好的。

所以我的应用程序的结构看起来像这样。

MainWindow.Xaml
    EntryView.Xaml
        Button1
        Button2
        TabControl
            UserControl1 (View)
            UserControl2 (View)
            UserControl3 (View)

儿子在我的 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>

入口视图模型.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 为空。我在视图模型的选项卡中放置了断点,但它没有被击中。所以问题一个是我这样做对吗?如果没有,我该怎么办?

4

2 回答 2

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>
于 2013-06-12T12:24:24.160 回答
0

真正的罪魁祸首只是

<TabControl.ContentTemplate>

仅将一个 DataTemplate 元素作为内容。该属性不能设置两次。

相反,为您的 TabControl(或窗口)资源中的每种类型提供一个 DataTemplate 就可以了。

理想情况下,在我看来,您只需将 UserControlViews 添加到您的 ItemsSource 中,并且视图可以将自己的 DataContext 设置为 ViewModels。

于 2017-01-13T14:54:12.373 回答