2010-10-31 4 views
0

Dire que j'ai XAML commeWPF: Manchettes ne fonctionne pas correctement

<TabControl Grid.Row="1" Grid.Column="2" ItemsSource="{Binding Tabs}" IsSynchronizedWithCurrentItem="True"> 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding TabTitle}" /> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
      <local:UserControl1 Text="{Binding Text}" /> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

Je veux demander où les propriétés ne TabTitle et Text viennent? Je pense que le devrait venir de chaque article de Tabs droite? Say Tabs est un ObservableCollection<TabViewModel>TabTitle & Text devrait être de TabViewModel propriétés droite. Mais cela semble vrai dans une certaine mesure. TabTitle est rempli correctement alors que Text ne l'est pas.

Text est déclarée comme propriété de dépendance à UserControl1 comme suit

public string Text 
{ 
    get { return (string)GetValue(TextProperty); } 
    set { SetValue(TextProperty, value); } 
} 

public static readonly DependencyProperty TextProperty = 
    DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new UIPropertyMetadata("")); 

Lorsque je onglets ne sont pas liés à un fonctionne bien

<TabControl Grid.Row="1" Grid.Column="1"> 
    <TabItem Header="Tab 1"> 
     <local:UserControl1 Text="Hello" /> 
    </TabItem> 
    <TabItem Header="Tab 2"> 
     <local:UserControl1 Text="World" /> 
    </TabItem> 
</TabControl> 
+0

Vérifiez la fenêtre de sortie pour les erreurs de liaison – benPearce

+0

Initialisez-vous TabViewModel.Text avec une certaine valeur? Ou c'est nul? En outre, votre TabViewModel implémente-t-il l'interface INotifyPropertyChanged? – Nawaz

Répondre

0

Si vous Binging UserControl à la propriété du fichier code-behind, vous devriez utiliser

{Binding RelativeSource={RelativeSource Mode=Self}, Path=Text} 

liaison directe comme u ont ne fonctionne que pour DataContext

0

liaisons ObservableCollection<TabViewModel> Je pense que je sais quel est le problème. L'élément dans UserControl1, qui doit être rempli par la propriété Text, n'observe pas les modifications de cette propriété. Donc, il y a deux façons:

1) Utilisation PropertyChangedCallback:

public static readonly DependencyProperty TextProperty = 
DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new UIPropertyMetadata(""), 
    new PropertyChangedCallback(OnTextPropertyChanged)); 

private static void OnTextPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
{ 
    ((UserControl1)sender).OnTextChanged(); 
} 

private void OnTextChanged() 
{ 
    this.myTextBlock.Text = this.Text; 
} 

2) Tricky Reliure:

<UserControl x:Class="UserControl1" x:Name="root" ...> 
... 
    <TextBlock Text="{Binding Text, ElementName=root}"/> 
... 
</UserControl> 
+0

hmm ... cela ne fonctionne toujours pas, il n'y a pas d'erreurs tho. aussi je pense que la syntaxe pour 'DependencyProperty.Register' est' publique statique readonly DependencyProperty TextProperty = DependencyProperty.Register ("Texte", typeof (chaîne), typeof (UserControl1), nouveau UIPropertyMetadata ("", nouveau PropertyChangedCallback (OnTextChanged))) ; ' –

+0

Mettez un point d'arrêt dans le gestionnaire TextChanged et vérifiez la valeur de la propriété. – vorrtex

Questions connexes