2017-09-06 11 views
-1

TabControlのItemSourceとしてObservableCollectionがあります。 MyClassはINotifyPropertyChangedインターフェイスを実装し、フィールド「Header」を持ちます。 コレクション内のMyClassメンバーを更新すると、対応するTabItemヘッダーは更新されません。バインドされたコレクションからのTabItemヘッダーの更新

なぜですか?

はここで非常に簡単な例です:

のMyClass:

public class MyClass : INotifyPropertyChanged 
{ 
    private string header; 
    public string Header 
    { 
     get 
     { 
      return header; 
     } 

     set 
     { 
      header = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("Header")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     PropertyChanged?.Invoke(this, e); 
    } 

    public override string ToString() 
    { 
     return Header; 
    } 
} 

メインウィンドウC#:

public partial class MainWindow : Window 
{ 
    public ObservableCollection<MyClass> test; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     test = new ObservableCollection<MyClass>(); 
     MyTabControl.ItemsSource = test; 
    } 

    private void Add_Click(object sender, RoutedEventArgs e) 
    { 
     test.Add(new MyClass() { Header = "DefaultHeader" }); 
    } 

    private void Change_Click(object sender, RoutedEventArgs e) 
    { 
     if(test.Count != 0) Test[0].Header = "Update!";  
    } 
} 

メインウィンドウXAML:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition></RowDefinition> 
     <RowDefinition></RowDefinition> 
     <RowDefinition></RowDefinition> 
    </Grid.RowDefinitions> 
    <TabControl Grid.Row="0" x:Name="MyTabControl" /> 
    <Button Content="Add item" Grid.Row="1" Click="Add_Click" /> 
    <Button Content="Change header" Grid.Row="2" Click="Change_Click" /> 
</Grid> 

任意のアイデアは?前もって感謝します!

答えて

1

プロパティが "Header"という名前であっても、自動的にTabItemの独自のHeaderプロパティにバインドされるわけではありません。

2つのプロパティを一緒にリンクしますあなたのTabControlのスタイルを作成します。

<TabControl> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="TabItem"> 
      <Setter Property="Header" Value="{Binding Header}"/> 
     </Style> 
    </TabControl.ItemContainerStyle> 
</TabControl> 
0

あなたが結合ヘッダーにSetter Property="Header"を使用しますTabControlItemContainerStyleを、欠けています。 バインディングを使用していない場合、値は割り当てられますが、更新されません。

このような何か:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition></RowDefinition> 
     <RowDefinition></RowDefinition> 
     <RowDefinition></RowDefinition> 
    </Grid.RowDefinitions> 
    <TabControl Grid.Row="0" x:Name="MyTabControl"> 
     <TabControl.ItemContainerStyle> 
      <Style TargetType="TabItem"> 
       <Setter Property="Header" Value="{Binding Header}"/> 
      </Style> 
     </TabControl.ItemContainerStyle> 
    </TabControl> 
    <Button Content="Add item" Grid.Row="1" Click="Add_Click" /> 
    <Button Content="Change header" Grid.Row="2" Click="Change_Click" /> 
</Grid> 
関連する問題