以下代码仅会创建一个
这会导致所有选项卡反映出任何未绑定到视图模型的状态:如果您移动一个
我不明白。是否有办法使用
编辑:在
更新:
所以我找到了一些解决方法,但我不太喜欢它们。我将研究编写转换器,将
MyTabView
实例。我已通过在MyTabView.xaml.cs中构造函数设置断点进行确认。该视图显示在选项卡中,无论我创建多少个选项卡,我都只会触发一次该构造函数。<DataTemplate DataType="{x:Type vm:MyTabViewModel}" x:Shared="false">
<vw:MyTabView />
</DataTemplate>
选项卡控件:
<TabControl
Grid.Row="1"
ItemsSource="{Binding Tabs}"
SelectedItem="{Binding SelectedTab}"
>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding DisplayName}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl>
这会导致所有选项卡反映出任何未绑定到视图模型的状态:如果您移动一个
GridSplitter
,那么在所有其他选项卡中都是相同的GridSplitter
,因此用户看起来好像您移动了它们所有。这太荒谬了。我不明白。是否有办法使用
TabControl
并具有多个相同类型的项目?编辑:在
DataTemplate
中添加x:Shared="false"
。更新:
所以我找到了一些解决方法,但我不太喜欢它们。我将研究编写转换器,将
ObservableCollection<Object>
转换为ObservableCollection<TabItem>
- 类似于实时更新版本。coll.Select(vm => new TabItem() { Content = vm });
......但我们将看到它是否喜欢从ItemsSource
获取TabItem
实例。我的钱说不要打赌。但我们会看到的。
更新2:花了一些时间才回到这里。使用交换选项卡项目集合的诀窍是有效的,但SelectedItem
存在问题。结果发现还有另一种解决方案(下面),它不会出现这个问题,而且避免了创建一个“中间人”集合所带来的复杂性和荒谬。这个解决方案也可以避免源集合发生变化时需要同步更改“中间人”集合的情况。