我使用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的属性?
答案 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
\ Triggers
和ResourceDictionaries
仅仅使用C#代码对我来说只是一种折磨。
根据我的经验,这是关于你的问题!!
要回答您的问题,请设置_tabControl.ItemsSource
吗?并确保ItemsSource
中的每个项目都包含EntityID
个属性。你的代码应该有用。
如果仍然无效,请尝试在Visual Studio的Output
窗口中查看是否存在绑定错误。