MVVM DataTemplate在Tabbing上复制View(但不同的ViewModel)

时间:2015-09-28 10:44:42

标签: c# wpf mvvm datatemplate

我的App.XAML上有一个DataTemplate

        <DataTemplate DataType="{x:Type ViewModels:MSMemberViewModel}">
            <Views:MSMemberView>
            </Views:MSMemberView>
        </DataTemplate>

我用它在另一个视图中的tabcontrol中创建视图:

    <TabControl ItemsSource="{Binding Tabs}" SelectedIndex="{Binding SelectedIndex}">
        <TabControl.ItemTemplate>

  //...
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <ContentControl Content="{Binding ViewModel}">

                </ContentControl>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

Tabs是包含选项卡名称和ViewModel的对象的ObservableCollection。

每次向ObservableCollection添加一个新选项卡时都会实例化新的ViewModel(我知道这是因为每次添加新选项卡时都会调用构造函数),并且我的代码对选项卡名称进行编号(因为每个选项卡都有不同的选项)名称),但视图重复!我该如何解决这个问题?

编辑:

此外,ObservableCollection上的ViewModel都没有反映调试时实例化的ViewModel / View的当前值。

2 个答案:

答案 0 :(得分:0)

因为我不知道字段绑定是如何实现的,所以这只是一个疯狂的猜测,但我认为你应该稍微更改DataTemplate。像这样......

<!-- your stuff -->
<TabControl.ContentTemplate>
   <DataTemplate>
       <ContentControl DataContext="{Binding ViewModel}">

       </ContentControl>
   </DataTemplate>
</TabControl.ContentTemplate>
<!-- your stuff -->

答案 1 :(得分:0)

通过使用此答案中的Dennis代码扩展TabControl来管理解决我的问题:

Stop TabControl from recreating its children

根据Dennis的说法,“TabControl共享一个面板来呈现其内容”,这也许就是为什么我也遇到了问题。