2010-09-06 8 views
0

J'ai créé un contrôle de fenêtre personnalisé (hérité de Windows), tout va bien sauf le texte de ma barre d'état. J'ai ajouté une nouvelle propriété à mon contrôle appelée "StatusText" et ce texte est affiché dans un TextBlock dans le style de mon contrôle.Comment mettre à jour une partie d'un style personnalisé WPF

Mais quand je change la propriété StatusText de ma fenêtre le texte ne change pas, ce n'est pas mise à jour. D'un autre côté, si je change la propriété Title de ma fenêtre (qui est une propriété héritée), le titre change correctement.

Alors peut-être que je n'ai pas correctement déclaré ma propriété StatusText? Ou je dois demander explicitement le TextBlock dans mon style pour mettre à jour?

Merci pour votre aide.

StatusText Déclaration Propriété:

private string m_StatusText; 

    public string StatusText 
    { 
     get { return m_StatusText; } 
     set { m_StatusText = value; } 
    } 

XAML style pour la barre d'état:

<!-- Status area --> 
<Border Grid.Row="2" Style="{DynamicResource SFM_StatusAreaStyle}" CornerRadius="0, 0, 7, 7" BorderThickness="1, 1, 1, 0"> 
    <Grid Style="{DynamicResource SFM_TitleBarStyleReflect}"> 
      <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Margin="6, 0, 0, 2" Foreground="{DynamicResource B_TextColor}" 
           Text="{Binding Path=StatusText, RelativeSource={RelativeSource AncestorType={x:Type local:SiluForm}, Mode=FindAncestor}}" /> 
    </Grid> 
</Border> 
+0

pouvez-vous s'il vous plaît poster votre code? Je suppose que vous voulez utiliser la liaison de données pour effectuer le changement de texte, mais personne ne sait exactement ce que vous faites, sauf si vous publiez du code/XAML. – Dave

Répondre

1

Mettre en oeuvre INotifyPropertyChanged dans votre classe contenant StatusText puis insérer le code de lainage événement PropertyChanged dans setter de StatusText:

public class MyClass : INotifyPropertyChanged 
{ 
    private string m_StatusText; 

    public string StatusText 
    { 
     get { return m_StatusText; } 
     set 
     { 
      m_StatusText = value; 
      raiseOnPropertyChanged("StatusText"); 
     } 
    } 

    #region Implementation of INotifyPropertyChanged 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void raiseOnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     #endregion 
} 
+0

Bonjour et merci pour votre réponse, mais je ne peux pas hériter INotifyPropertyChanged car mon contrôle hérite déjà de la classe Window. C# ne supporte pas l'héritage multiple droit? – Karnalta

+0

INotifyPropertyChanged est une interface, les classes C# peuvent hériter de plusieurs interfaces, car elles spécifient ce qu'une classe doit contenir sans spécifier de fonctionnalité exacte. – Val

+0

Merci a travaillé comme un charme. – Karnalta

0

En plus de l'implémentation de l'interface INotifyPropertyChanged comme Eugene a répondu ci-dessus, vous devrez peut-être définir DataContext = this dans votre constructeur de classes de fenêtres personnalisées. Ensuite, vous ne devriez pas avoir besoin de la liaison RelativeSource. Sauf si vous utilisez le DataContext de la fenêtre personnalisée à d'autres fins.

Questions connexes