出于某种原因,我TabControl很难在绑定ItemsSource到ObservableCollection视图模型时让我正确显示.我的设计基于这里的教程:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx.我确实在这里发现了一些像我这样的问题,但没有一个问题解决了我 这是我TabControl的xaml.
<TabControl ItemsSource="{Binding Workspaces}"
SelectedIndex="{Binding ActiveWorkspaceIndex}"
ItemTemplate="{StaticResource ClosableTabItemTemplate}"/>
Run Code Online (Sandbox Code Playgroud)
ClosableTabItemTemplate以下是哪里.
<DataTemplate x:Key="ClosableTabItemTemplate">
<DockPanel Width="120">
<Button
Command="{Binding Path=CloseCommand}"
Content="X"
Cursor="Hand"
DockPanel.Dock="Right"
Focusable="False"
FontFamily="Courier"
FontSize="9"
FontWeight="Bold"
Margin="0,1,0,0"
Padding="0"
VerticalContentAlignment="Bottom"
Width="16" Height="16"
/>
<ContentPresenter
Content="{Binding Path=DisplayName}"
VerticalAlignment="Center"
/>
</DockPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
Workspaces是ObservableCollection视图模型.ActiveWorkspaceIndex只是我在视图模型中跟踪的活动工作区索引.我通过App.xaml文件中的以下数据模板将我的视图模型与视图实例相关联.
<DataTemplate DataType="{x:Type vm:ViewModelStartPage}">
<v:ViewStartPage/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
我只在我的工作空间集合中添加了一个视图模型.我看到选项卡控件中显示了2个视图,它们没有标签.这几乎就像TabControl不知道将不同的视图视为TabItems,它的行为更像堆栈面板,堆叠视图.如果我在代码中创建选项卡项,它可以正常工作:
System.Windows.Controls.TabItem i = new System.Windows.Controls.TabItem();
i.Content = new Views.ViewStartPage();
i.Header = "A Tab Item";
this.xTabControl.Items.Add(i);
Run Code Online (Sandbox Code Playgroud)
我必须遗漏一些内容模板或其他东西.我将在稍后设置我的标签样式,但是现在我很乐意让基本标签工作.标签内容中的视图对于每个选项卡也可能不同,所以我不能使用我看到的所有地方的简单文本块TabControl模板示例...即使不是这样......
<TabControl.ContentTemplate>
<DataTemplate> …Run Code Online (Sandbox Code Playgroud) 这些是我的类:
class mainViewModel
{
public List<Foo> F { get; set; }
public mainViewModel()
{
F=new List<Foo>()
{
new Foo(new Animal(){Name = "Cat"}),
new Foo(new Animal(){Name = "Dog"}),
new Foo(new Animal(){Name = "Camel"})
};
}
}
public class Foo
{
public Animal Animal { get; set; }
public Foo(Animal animal)
{
Animal = animal;
}
}
public class Animal
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的MainWindow Xaml代码:
<TabControl ItemsSource="{Binding Path=F}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Animal.Name}"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate> …Run Code Online (Sandbox Code Playgroud) 当谈到我目前在WPF中的绑定需求时,我处于绑定状态(没有双关语).我花了大部分时间试图研究我的问题,我找不到解决问题的可靠方法.这里是:
我正在尝试创建一个用户控件来表示我所称的工作空间(Josh Smith的博客参考).工作区将显示在选项卡控件中.我的目标是使用选项卡式界面来管理我打开的各种文档,就像在一本激动人心的工作簿的浏览器中一样.
每次用户使用新工作区时,该工作区都应显示在选项卡控件中.每个工作空间采用用户控件的形式,每个工作空间都有自己的视图模型.我希望Tab Header能够从我的视图模型中显示一个属性,我认为它可能必须通过我的用户控件作为属性公开.
到目前为止,在我遇到很多问题之前,我最喜欢的最干净的解决方案是使用datatemplates.基本上我做了以下事情:
<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}"/>
Run Code Online (Sandbox Code Playgroud)
TabControl.ItemsSource绑定到包含所有工作空间的observablecollection(Object).
这项工作很有效,除了两件事:
如果我打开多个客户,那么我打开了多个工作区.由于DataTemplate Recycling,当我从一个选项卡切换到另一个选项卡时,我会丢失状态.所以没有约束的一切都会失去状态.
不同工作区(使用不同的数据模板)之间交换的性能非常慢.
所以...我在SO上找到了另一个用户的建议,将用户控件添加到ObservableCOllection并丢弃数据模板.现在解决了失去国家的问题之一.但是,现在我面临着剩下的两个问题:
然后,我继续在我的代码隐藏中向ObservableCollection添加一个TabItem,并将TabItem.Content属性设置为用户控件的属性.由于我已经删除了DataTemplates的使用,速度问题现在已经消除,因为失败状态问题.但是,我现在遇到了将TabItem.header绑定到我的usercontrol的Custome"Title"属性的问题,该属性应该显示在Tab Header中.
在这篇非常长的帖子之后,我的问题是:
有没有办法使用datatemplates并强制它们为集合中的每个项目创建一个新实例,以防止回收和状态丢失.
1A.有没有比我在上面的帖子中提到的更好的选择?
有没有办法通过Xaml而不是通过Tab项的后端代码构造来完成所有这些?