我有一个TabControl,我动态创建标签。我发现很难改变TabItem的标题。
<TabControl Name="AttorneysTabControl" Grid.Column="2" Grid.Row="0">
<TabControl.Resources>
<DataTemplate x:Key="AttorneyTabHeader">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Names}" Margin="2,0,0,0" FontSize="16" VerticalAlignment="Center" />
<Button Width="Auto" UseLayoutRounding="False" BorderBrush="Transparent" Background="Transparent" Click="CloseAttorneysTabButtonClick">
<Image Source="/images/close-cross-thin-circular-button/close-cross-thin-circular-button16.png" Height="16"></Image>
</Button>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="AttorneyTabContent">
<local:AttorneyDetails></local:AttorneyDetails>
</DataTemplate>
</TabControl.Resources>
对于每个TabItem,我从HeaderTemplate
设置TabControl.Resources
,就像这样;
newTabItem.HeaderTemplate = (System.Windows.DataTemplate)AttorneysTabControl.FindResource("AttorneyTabHeader");
但是,一旦设置了模板,我不知道如何更改TabItem标头的内容。我已尝试使用DataContext作为TabItem,如果这样做,但它不起作用,所以我可以在模板中使用Binding
。这将更容易。
答案 0 :(得分:0)
您通常应该写(第一行是您未更改的代码):
newTabItem.HeaderTemplate = (System.Windows.DataTemplate)AttorneysTabControl.FindResource("AttorneyTabHeader");
var tabItemData = new TabItemData() { Name="Initial name"} ;
newTabItem.DataContext = tabItemData;
然后,一旦您需要更新标签页:
tabItemData.Name = "New name".
如果这不起作用,那可能是因为您的TabItemData.Name
媒体资源没有通知其更改。因此,请确保您的TabItemData
类实现INotifyPropertyChanged
并且Name属性通知。例如:
public class TabItemData : INotifyPropertyChanged
{
private string name;
public string Name
{
get { return this.name; }
set
{
if (value != this.name)
{
this.name= value;
NotifyPropertyChanged("Name");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
如果您丢失了,我建议您阅读Learn WPF MVVM本书中的管理WPF应用程序中的数据章节。