WPF浏览子元素或跟踪动态创建的子元素

时间:2017-11-13 15:55:04

标签: c# wpf

我有一个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。这将更容易。

1 个答案:

答案 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应用程序中的数据章节。