+-
c# – 在WPF Tabcontrol标题模板中显示SelectedIndex
我的应用程序中有1 … n个tabcontrols,具有以下XAML设置:

<TabControl Name="ordersTabControl" ItemsSource="{Binding CoilItems}"> <TabControl.ItemTemplate> <DataTemplate DataType="models:Coil"> <StackPanel> <TextBlock Text="{Binding CoilCode, StringFormat='Coil: {0}'}" /> <TextBlock Text="{Binding ArticleCode, StringFormat='Auftrag: {0}'}" /> <TextBlock Text="{Binding RestWeight, StringFormat='Restgewicht: {0} kg'}" /> </StackPanel> </DataTemplate> </TabControl.ItemTemplate> <TabControl.ContentTemplate> [...] </TabControl.ContentTemplate> </TabControl>

打开的选项卡数量在运行时更改.现在我想在每个标签中显示索引(即第一个标签显示“订单1”,第二个“订单2”等等)以及每个标题中已有的信息.

使用DataTemplate时AFAIK我无法通过代码隐藏访问tab-properties,所以在XAML中是否有任何方法可以在tabheader中绑定文本块以显示tabcontrol中该特定选项卡的索引?

我认为应该可以使用RelativeSource和FindAncestors吗?唉,我真的找不到关于这些设置的任何明确的教程(我2天前才开始使用WPF).

最佳答案
我将使用附加属性为您提供解决方案.检查代码:

附属物

public static class IndexAttachedProperty { #region TabItemIndex public static int GetTabItemIndex(DependencyObject obj) { return (int) obj.GetValue(TabItemIndexProperty); } public static void SetTabItemIndex(DependencyObject obj, int value) { obj.SetValue(TabItemIndexProperty, value); } // Using a DependencyProperty as the backing store for TabItemIndex. This enables animation, styling, binding, etc... public static readonly DependencyProperty TabItemIndexProperty = DependencyProperty.RegisterAttached("TabItemIndex", typeof (int), typeof (IndexAttachedProperty), new PropertyMetadata(-1)); #endregion #region TrackTabItemIndex public static bool GetTrackTabItemIndex(DependencyObject obj) { return (bool) obj.GetValue(TrackTabItemIndexProperty); } public static void SetTrackTabItemIndex(DependencyObject obj, bool value) { obj.SetValue(TrackTabItemIndexProperty, value); } // Using a DependencyProperty as the backing store for TrackTabItemIndex. This enables animation, styling, binding, etc... public static readonly DependencyProperty TrackTabItemIndexProperty = DependencyProperty.RegisterAttached("TrackTabItemIndex", typeof (bool), typeof (IndexAttachedProperty), new PropertyMetadata(false, TrackTabItemIndexOnPropertyChanged)); private static void TrackTabItemIndexOnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var tabControl = GetParent(d, p => p is TabControl) as TabControl; var tabItem = GetParent(d, p => p is TabItem) as TabItem; if (tabControl == null || tabItem == null) return; if (!(bool)e.NewValue) return; int index = tabControl.Items.IndexOf(tabItem.DataContext == null ? tabItem : tabItem.DataContext); SetTabItemIndex(d, index); } #endregion public static DependencyObject GetParent(DependencyObject item, Func<DependencyObject, bool> condition) { if (item == null) return null; return condition(item) ? item : GetParent(VisualTreeHelper.GetParent(item), condition); } }

此代码定义了两个附加属性,第一个是设置项是否跟踪包含它的选项卡项索引.第二个是索引属性.

XAML示例代码:

<TabControl.ItemTemplate> <DataTemplate DataType="{x:Type WpfApplication3:A}"> <StackPanel x:Name="tabItemRoot" WpfApplication3:IndexAttachedProperty.TrackTabItemIndex ="True"> <TextBlock Text="{Binding Text}"/> <TextBlock Text="{Binding Path=(WpfApplication3:IndexAttachedProperty.TabItemIndex), ElementName=tabItemRoot}"/> </StackPanel> </DataTemplate> </TabControl.ItemTemplate>

上面的代码是使用附加属性的示例.您可以轻松地适应您的代码.

结果:

希望这段代码适合你……

点击查看更多相关文章

转载注明原文:c# – 在WPF Tabcontrol标题模板中显示SelectedIndex - 乐贴网