2010-11-29 4 views
1

Je sais que ce une question très simple ..WPF - DataBind TextBlock.Text en entier

J'ai un Textblock qui est la propriété de texte que je veux être DataBound à un nombre entier j'ai dans le codebehind .. en ce moment je m faisant

<TextBlock Name="TextBlockCompeltedSongsNumber" Text="{Binding}"></TextBlock> 

Puis, en C# ..

  this.TextBlockCompeltedSongsNumber.DataContext = CompeltedTracks; 

Où CompletedTracks est un public int

Qu'est-ce qui me manque?

+0

Cela devrait fonctionner très bien , quels problèmes obtenez-vous? –

+0

Le TextBlock n'affiche rien ... il reste vide toujours ... – Ryan

+0

@Ryan: Quel message d'erreur obtenez-vous cependant? Regardez la fenêtre de sortie pour une "erreur de liaison" lorsque vous exécutez votre application. Cela vous aidera à comprendre quel est le problème. –

Répondre

0

Peut-être que vous avez défini DataContext trop tard. Après c'est rendu.

N'est-il pas préférable de lier directement à une propriété et de déclencher l'événement PropertyChanged?

<TextBlock Text="{Binding CompletedTracks}"></TextBlock> 

et de définir DataContext du parent du TextBlock au propriétaire de CompletedTracks.

+0

CompletedTracks propriétaire est la fenêtre que tout cela se passe à l'intérieur ... comment puis-je définir ce datacontext? this.TextBlockCompeltedSongsNumber.DataContext = this; ?? – Ryan

+0

dans Windows ctor: this.DataContext = this; – Shrike

0

En fin de compte je viens de faire une classe qui a mis en œuvre INotifyPorpertyChange

//Global Declaration 
information info = new information(); 

plus tard ...

  this.TextBlockCompeltedSongsNumber.DataContext = info; 

et la classe d'information

public class information : INotifyPropertyChanged 
{ 
    private int failedTracks = 0; 
    public int FailedTracks { get { return failedTracks; } set { failedTracks = value; OnPropertyChanged("FailedTracks"); } } 
    private int compeltedTracks = 0; 
    public int CompeltedTracks { get { return compeltedTracks; } set { compeltedTracks = value; OnPropertyChanged("CompeltedTracks"); } } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 

et enfin dans le XAML

    <TextBlock Name="TextBlockCompletedSongs" Margin="5,0,5,0">Completed Songs:</TextBlock> 
       <TextBlock Name="TextBlockCompeltedSongsNumber" Text="{Binding Path=CompeltedTracks}"></TextBlock> 
       <TextBlock Name="TextBlockFailedSongs" Margin="5,0,5,0">Failed Songs:</TextBlock> 
       <TextBlock Name="TextBlockFailedSongsNumber" Text="{Binding Path=FailedTracks}"></TextBlock> 

Il semble que beaucoup de travail pour quelque chose qui devrait être simple ... mais je ne pourrais pas le faire travailler d'une autre façon ... Je ne sais pas ce que je faisais mal: O

+0

Malheureusement, vous devez le faire. Comment WPF est-il supposé savoir que votre propriété a changé? Si vous souhaitez que l'interface utilisateur se mette à jour lorsque vous modifiez votre propriété, * quelque chose * doit indiquer à WPF. INotifyPropertyChanged est la manière habituelle de le faire. Ce serait merveilleux si C# pouvait faire en sorte que les propriétés le fassent automatiquement, mais elles ne le peuvent pas, et ainsi vous finissez par écrire énormément de choses de ce genre dans WPF. –