XAML DataTemplate 只创建一个实例

15e*_*153 5 wpf xaml tabcontrol datatemplate

以下内容仅创建 的一个实例MyTabView。我通过在 MyTabView.xaml.cs 的构造函数中放置断点来确认这一点。该视图显示在一个选项卡中,无论我创建多少个选项卡,我只点击该构造函数一次。

<DataTemplate DataType="{x:Type vm:MyTabViewModel}" x:Shared="false">
    <vw:MyTabView />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

选项卡控制:

    <TabControl
        Grid.Row="1"
        ItemsSource="{Binding Tabs}"
        SelectedItem="{Binding SelectedTab}"
        >
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding DisplayName}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
    <TabControl>
Run Code Online (Sandbox Code Playgroud)

这会导致所有选项卡反映共享未绑定到视图模型的任何状态:如果您移动GridSplitter,则所有其他选项卡中的情况都是相同的GridSplitter,因此用户会觉得您移动了所有选项卡。这太荒谬了。

我不明白。有什么办法可以TabControl同时使用多个相同类型的项目吗?

编辑:添加x:Shared="false"到DataTemplate.

更新:

所以我找到了一些修复方法,但我不太喜欢它们。我将考虑编写一个转换器来转换ObservableCollection<Object>为ObservableCollection<TabItem>- 有点像实时更新版本

coll.Select(vm => new TabItem() { Content = vm });
Run Code Online (Sandbox Code Playgroud)

...但我们会看看它是否喜欢TabItem从 获取实例ItemsSource。我的钱说不要赌它。但我们会看到。

更新2:花了一段时间才回到这个话题。交换选项卡项目集合的花招是有效的,但SelectedItem存在问题。事实证明,还有另一种解决方案(如下)不会产生该问题,并且还避免了创建必须镜像源集合中的更改的“中间人”集合的复杂性和愚蠢性。

Bra*_*ner 0

尝试向您的模板添加x:Shared="false"属性。