相关疑难解决方法(0)

将TabControl ItemsSource绑定到ViewModels的集合

出于某种原因,我TabControl很难在绑定ItemsSourceObservableCollection视图模型时让我正确显示.我的设计基于这里的教程: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)

WorkspacesObservableCollection视图模型.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)

wpf xaml binding tabcontrol

8
推荐指数
1
解决办法
1万
查看次数

如何在TabControl的ItemsSource绑定到WPF中的列表时设计TabPage?

这些是我的类:

   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)

.net c# wpf xaml tabcontrol

6
推荐指数
1
解决办法
4008
查看次数

绑定到WPF中的TabControl的ItemsSource

当谈到我目前在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).

这项工作很有效,除了两件事:

  1. 如果我打开多个客户,那么我打开了多个工作区.由于DataTemplate Recycling,当我从一个选项卡切换到另一个选项卡时,我会丢失状态.所以没有约束的一切都会失去状态.

  2. 不同工作区(使用不同的数据模板)之间交换的性能非常慢.

所以...我在SO上找到了另一个用户的建议,将用户控件添加到ObservableCOllection并丢弃数据模板.现在解决了失去国家的问题之一.但是,现在我面临着剩下的两个问题:

  1. 如何在不使用DataTemplate的情况下设置TabItem.Header属性
  2. 除非它们是相同的DataTemplate,否则在选项卡之间来回交换的速度仍然很慢.

然后,我继续在我的代码隐藏中向ObservableCollection添加一个TabItem,并将TabItem.Content属性设置为用户控件的属性.由于我已经删除了DataTemplates的使用,速度问题现在已经消除,因为失败状态问题.但是,我现在遇到了将TabItem.header绑定到我的usercontrol的Custome"Title"属性的问题,该属性应该显示在Tab Header中.

在这篇非常长的帖子之后,我的问题是:

  1. 有没有办法使用datatemplates并强制它们为集合中的每个项目创建一个新实例,以防止回收和状态丢失.

    1A.有没有比我在上面的帖子中提到的更好的选择?

  2. 有没有办法通过Xaml而不是通过Tab项的后端代码构造来完成所有这些?

wpf binding tabcontrol datatemplate tabitem

1
推荐指数
1
解决办法
8650
查看次数

标签 统计

tabcontrol ×3

wpf ×3

binding ×2

xaml ×2

.net ×1

c# ×1

datatemplate ×1

tabitem ×1