当我涉及到WPF当前的绑定需求时,我处于绑定(无双关语意图)。我花了一天中最好的时间来研究我的问题,但我找不到解决我的问题的可靠解决方案。这里是:在WPF中绑定到TabControl的ItemsSource
我想创建一个用户控件,表示我正在调用工作区(Josh Smith的博客参考)。工作区将显示在选项卡控件中。我打算使用标签界面来管理我在非常酷的工作簿浏览器中打开的各种文档。
每次用户创建一个新的工作区时,该工作区都应显示在选项卡控件中。每个工作区都采用用户控件的形式,每个工作区都有自己的视图模型。我希望Tab Header能够从我的视图模型中显示一个属性,我认为它可能必须通过我的用户控件作为属性公开。
到目前为止,直到遇到很多问题时,我最喜欢的最干净的解决方案是使用数据模板。基本上我做了以下内容:
<DataTemplate x:Key="WorkspaceItem">
<DockPanel Width="120">
<ContentPresenter
Content="{Binding Title}"
VerticalAlignment="Center"
/>
</DockPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type CustomerViewModel}">
<workspace:CustomerWorkspace />
</DataTemplate>
<TabControl ItemsSource="{Binding Workspaces}" ItemTemplate="{StaticResource WorkspaceItem}"/>
的TabControl.ItemsSource必然包含了所有我的工作空间的(对象)一个ObservableCollection。
这个工作,除了两件事情很大:
如果我打开多个客户,然后我有多个工作区中打开。由于DataTemplate Recycling,当我从一个标签切换到另一个标签时,我失去了状态。所以所有不受约束的东西都会失去状态。
不同工作空间(使用不同数据模式)之间交换的性能非常缓慢。
所以...我从SO上的另一个用户发现了一个建议,将用户控件添加到ObservableCOllection并丢弃数据模板。现在解决了失去国家的问题之一。但是,我现在面对的2个遗留问题:
- 我如何设置TabItem.Header属性,而不使用一个DataTemplate
- 交换来回标签之间的速度依然很慢,除非他们的相同的DataTemplate。
然后我开始实际添加一个TabItem到我的代码隐藏的ObservableCollection中并将TabItem.Content属性设置为用户控件的属性。现在已经消除了速度问题,因为我已经删除了DataTemplates的使用,所以这是丢失状态问题。但是,我现在坚持将TabItem.header绑定到应该在Tab标题中显示的我的usercontrol的Custome“Title”属性上。
所以在此之后非常长的帖子,我的问题是:
有没有办法使用的DataTemplates,迫使他们在集合中创建的每个项目一个新的实例,以防止回收和国家的损失。 1)。有没有比我在上面的帖子中提到的更好的选择?
有没有办法通过Xaml完成所有这些工作,而不是通过Tab项目的后端代码构建?