将选项卡标题绑定到代码中的属性

时间:2012-10-26 11:00:29

标签: wpf

我使用ItemSource属性将集合绑定到TabControl。

我在代码中编写WPF而不是在XAML中编程以获得更深入的理解。

我遇到的问题是,如果我想将TabItem的标头绑定到属性(“EntityID”),则绑定不会启动。

如果我设置一个值而不是一个绑定(注释中的代码)

,代码就可以工作
var binding = new Binding();
binding.Path = new PropertyPath("EntityID");

DataTemplate itemTemplate = new DataTemplate();
var label = new FrameworkElementFactory(typeof(Label));

//label.SetValue(Label.ContentProperty,"test");
label.SetBinding(Label.ContentProperty, binding);

itemTemplate.VisualTree = label;

_tabControl.ItemTemplate = itemTemplate;

此外,如果设置ContentTemplate而不是ItemTemplate,则绑定也可以。

如何从纯代码中将tab标题绑定到我的ItemsSource的属性?

2 个答案:

答案 0 :(得分:1)

有许多方法可以从Code Behind设置绑定。你应该尝试绑定的是TabItem上的HeaderProperty。虽然你必须先检索它才能做到这一点。

这是一个应该让你开始的工作示例。这不是我会这样做的方式,就像我在xaml中那样做,但正如你要求从后面的代码那样做,在这里你去:)

另一方面,在Code中定义模板几乎总是一个坏主意,尽量避免使用它。

<强> Windows.xaml

<Window x:Class="StackOverflow.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    xmlns:local="clr-namespace:StackOverflow"
    Title="Super long title of the super window" Width="500" Height="300">

    <Window.Resources>
        <DataTemplate DataType="{x:Type local:Entity}">
            <TextBlock Text="{Binding Id}" FontSize="{Binding Size}" />
        </DataTemplate>
    </Window.Resources>

    <local:MyTabControl x:Name="tabControl" ItemsSource="{Binding Entities}" />

</Window>

<强> Window.xaml.cs

using System.Windows;
using System;
using System.Windows.Data;
using System.Collections.Generic;
using System.Windows.Controls;

namespace StackOverflow
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    public IEnumerable<Entity> Entities
    {
        get
        {
            for (int i = 0; i < 5; i++)
            {
                yield return new Entity() { Id = i };
            }
        }
    }
}

public class MyTabControl : TabControl
{
    protected override DependencyObject GetContainerForItemOverride()
    {
        var tabitem = base.GetContainerForItemOverride() as TabItem;
        if (tabitem != null)
        {
            tabitem.Loaded += OnTabItemLoaded;
        }
        return tabitem;
    }

    void OnTabItemLoaded(object sender, RoutedEventArgs e)
    {
        var tabItem = sender as TabItem;
        if (tabItem == null)
            throw new InvalidOperationException();
        tabItem.SetBinding(TabItem.HeaderProperty, new Binding("DisplayName"));
    }
}

public class Entity : DependencyObject
{
    public int Id { get; set; }
    public string DisplayName { get { return "Entity ID : " + Id; } }
}
}

答案 1 :(得分:1)

一些事情......

  

作为WPF设计人员和开发人员,XAML是GUI和Code的最佳方式   隔离背后。它并没有减少我对WPF的理解   无论如何。所以我推荐XAML。

相信我自己是Winforms / ASP.NET开发人员,我最初不愿意使用XAML,但我必须编写大量的代码以及各种GUI元素之间的关系以及驯服野兽称为Templates \ Styles \ TriggersResourceDictionaries仅仅使用C#代码对我来说只是一种折磨。

根据我的经验,这是关于你的问题!!

要回答您的问题,请设置_tabControl.ItemsSource吗?并确保ItemsSource中的每个项目都包含EntityID个属性。你的代码应该有用。

如果仍然无效,请尝试在Visual Studio的Output窗口中查看是否存在绑定错误。