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存在问题。事实证明,还有另一种解决方案(如下)不会产生该问题,并且还避免了创建必须镜像源集合中的更改的“中间人”集合的复杂性和愚蠢性。