2017-11-13 11 views
0

タブを動的に作成するTabControlがあります。私はTabItemのタイトルを変更するのが難しいと思っています。私はこのようなTabControl.ResourcesからHeaderTemplateを設定し、それぞれのTabItemについてWPF子要素をナビゲートするか、動的に作成された子要素を追跡する

<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> 

newTabItem.HeaderTemplate = (System.Windows.DataTemplate)AttorneysTabControl.FindResource("AttorneyTabHeader"); 

しかし、テンプレートが設定されたら、TabItemヘッダーの内容を変更する方法はわかりません。私はTabContemのためにDataContextを使用しようとしましたが、それはそれを行う方法ですが、うまくいかなかったので、テンプレートにBindingを使用するだけでした。それははるかに簡単になります。

newTabItem.HeaderTemplate = (System.Windows.DataTemplate)AttorneysTabControl.FindResource("AttorneyTabHeader"); 
var tabItemData = new TabItemData() { Name="Initial name"} ; 
newTabItem.DataContext = tabItemData; 

そして、あなたはタブヘッダー更新する必要が一度:

+0

'TabContem.ItemContainerStyle'は' TabItem'を定義し、 'Header'を変更/バインドすることができます。 – Sinatr

+0

https://stackoverflow.com/questions/5650812/how-do-i-bind-a-tabcontrol-to-a-collection-of-viewmodels –

+0

私は 'newTabItem.HeaderTemplate =(System。 Windows.DataTemplate)AttorneysTabControl.FindResource( "AttorneyTabHeader"); 'HeaderTemplateを設定します。このテンプレートはTabControl内にあります。 – LogicDev

答えて

0

あなたは、通常、(最初の行は、あなたの変わらないコードである)書くべきことが機能しなかった場合は

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アプリケーション章で管理データを読み込むことをお勧め失っています。

+0

それは動作していないようです。クラス 'プライベートクラスTabItemData:INotifyPropertyChanged'を作成しました。 DataContextを任意の要素に追加し、WPFのその要素にクラスをバインドできますか? – LogicDev

+0

はいできます。だからこそ私はあなたに "newTabItem.DataContext = tabItemData"と書いてあります。 INotifyPropertyChangedを実装するとうまくいきました。そのクラスのNameプロパティが変更を通知して、コードが値を変更したときにUIが自動的に更新されるようにしてください。私の更新された回答を通知コードで見てください。 –

関連する問題