2010-04-30 1 views
2

У меня есть TextBox в StatusBar в wpf, который я хочу обновить.Обновить текст в StatusBar в wpf с помощью C#

У меня есть список файлов в ListBox. В каждом файле я бы выполнил некоторую операцию, вызвав метод метода ProcessFile(). Итак, всякий раз, когда обработка файлов завершена, я хочу показать это имя файла в тексте StatusBar.

Я пытался что-то вроде этого:

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; 
    } 

Но я могу видеть только имя последнего файла в StatusBar. Что не так с кодом? Может кто-нибудь это исправить? Спасибо.

ответ

0

Когда вы используете ViewModel, я бы определил свойство «ProcessedFile» в вашей модели ViewModel и привязал текстовое поле вашего StatusBar к свойству.

Каждый раз, когда вы обрабатывали файл, я бы установил свойство «ProcessedFile» в имя файла.

Это код для 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 
    } 
} 

Heres XAML привязывает TextBox к свойству. (Я предполагаю, что ViewModel устанавливается как DataContext для TextBox)

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

Там больше способов сделать это.

содержание Набор непосредственно из кода
Вам нужно дать имя к TextBox, так что вы можете получить доступ к его содержание:

XAML

<TextBox x:Name="myTextBox" /> 

C#

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

Использование привязка данных
Вам необходимо создать некоторый объект и установить его как DataContext в TextBox или какой-либо элемент WPF, содержащий это текстовое поле (строка состояния, окно, ...).

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)); 
     } 
    } 
} 

Для получения дополнительной информации о привязке данных см Data Binding Overview

+0

почему должен я создать класс spearate, если это может быть сделано только с несколькими линиями с помощью Диспетчера ? – Archie

+0

Для объяснения см. Статью «Обзор привязки данных». Ссылка выше в конце ответа. – zendar