2010-04-30 6 views
2

J'ai un TextBox dans StatusBar dans wpf que je veux mettre à jour.Mettre à jour le texte dans StatusBar dans wpf en utilisant C#

J'ai une liste de fichiers dans ListBox. Sur chaque fichier je ferais une opération en appelant say method ProcessFile(). Chaque fois que le traitement de fichier est terminé, je veux afficher le nom de ce fichier dans le texte StatusBar.

J'ai essayé quelque chose comme ceci:

private void button_Click(object sender, RoutedEventArgs e) 
    { 

     statusBar.Visibility = Visibility.Visible; 

     DispatcherFrame frame = new DispatcherFrame(); 
     Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(TimeConsumingMethod), frame); 
     Dispatcher.PushFrame(frame); 
     statusBar.Visibility = Visibility.Collapsed; 
    } 

    public object TimeConsumingMethod(Object arg) 
    { 
     ((DispatcherFrame)arg).Continue = false; 

     foreach (string fileName in destinationFilesList.Items) 
     { 
      txtStatus.Text = fileName.ToString(); 
      //Assume that each process takes some time to complete 
      System.Threading.Thread.Sleep(1000); 
     } 
     return null; 
    } 

Mais je ne peux voir le nom du dernier fichier dans la barre d'état. Quel est le problème avec le code? Quelqu'un peut-il le corriger? Merci.

Répondre

0

Lorsque vous utilisez un ViewModel, je définir une propriété « ProcessedFile » dans votre ViewModel et lier la zone de texte de votre StatusBar à la propriété.

Chaque fois que vous avez traité un fichier i fixerait la propriété « ProcessedFile » au nom du fichier.

Voici du code pour ViewModel.

public class ViewModel : INotifyPropertyChanged { 
    private string _processedFile; 
    public string ProcessedFile { 
     get { 
      return _processedFile; 
     } 
     set { 

      if (_processedFile != value) { 
       _processedFile = value; 

       if (PropertyChanged != null) { 
        PropertyChanged(this, new PropertyChangedEventArgs("ProcessedFile")); 
       } 
      } 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 

    public void ProcessFile() { 
     // Process the file 
     ProcessedFile = //Set the Property to the processed file 
    } 
} 

Utilise le code XAML pour lier le TextBox à la propriété. (Je suppose que le ViewModel est défini en tant que DataContext pour le TextBox)

<TextBox Text="{Binding ProcessedFile, Mode=OneWay}"/> 
2

Il existe d'autres façons de procéder.

Set contenu directement à partir du code
Vous devez donner le nom à la TextBox afin que vous puissiez accéder à son contenu:

XAML

<TextBox x:Name="myTextBox" /> 

C#

... 
ProcessFile(someFileName); 
myTextBox.Text = someFileName; 

Utilisation liaison de données
Vous devez créer un objet et le définir comme DataContext au TextBox ou un élément WPF qui contiennent cette zone de texte (barre d'état, fenêtre, ...).

XAML:

<TextBox Text="{Binding Path=ProcessedFileName}" /> 

C#

public MyClass : INotifyPropertyChanged 
{ 
    public string ProcessedFileName {get; set;} 

    public void ProcessFile(string someFileName) 
    { 
     // Processing file code here 

     // When done processing, set file name to property 
     ProcessedFileName = someFileName; 
     OnPropertyChanged("ProcessedFileName"); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Pour plus d'informations sur la liaison de données voir Data Binding Overview

+0

pourquoi vais-je créer une classe spearate si elle ne peut se faire avec quelques lignes à l'aide de Dispatcher ? – Archie

+0

Voir l'article "Aperçu de la liaison de données" pour des explications. Le lien est au-dessus à la fin de la réponse. – zendar