2016-08-15 5 views
0

Я пытаюсь реализовать progressbar в своем приложении WPF.Progerssbar не будет обновлять

Так что я добавил один на мой взгляд

 <ProgressBar Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Height="31" 
       Minimum="0" 
       Maximum="50" 
      Value="{Binding CurrentProgress}" /> 

Мой ViewModel получил новое свойство:

public int CurrentProgress 
{ 
    get { return mCurrentProgress; } 
    set 
    { 
    if (mCurrentProgress != value) 
    { 
     mCurrentProgress = value; 
     RaisePropertyChanged("CurrentProgress"); 
    } 
    } 
} 

Когда моя команда выполняется нагрузки, он поднимает сгенерированного событие для каждого загруженного файла. И EventHandler к этому событию добавляет +1 к свойству «CurrentProgress», как это:

private void GeneratedHandler(object sender, EventArgs eventArgs) 
{ 
    CurrentProgress++; 
} 

Но я не вижу никакого прогресса в баре. Кто-нибудь видит, что я делаю неправильно? Спасибо заранее!

+0

Вы выполняете работу в потоке пользовательского интерфейса. Нить пользовательского интерфейса не может обновлять пользовательский интерфейс во время выполнения в нем работы. Вы используете поток для загрузки файлов. – Will

ответ

1

Я пробовал воспроизвести вашу проблему, но здесь все отлично.

Во всяком случае, есть несколько шагов, которые вы можете следовать:

  1. Убедитесь, что вы не загружаете файлы в потоке пользовательского интерфейса. Если да, взгляните на «Отображение прогресса при выполнении длительной задачи» на странице this.

  2. Убедитесь, что DataContext вашего Window правильно, ваш ViewModel реализует System.ComponentModel.INotifyPropertyChanged и ваш метод RaisePropertyChanged правильно.


Вот код, который я использовал (не копировать и вставлять app.xml):

ViewModel:

public class MainWindowViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void NotifyPropertyChanged([CallerMemberName] string property = "") 
    { 
     if(PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 

    private int _Progress; 
    public int Progress 
    { 
     get 
     { 
      return _Progress; 
     } 

     set 
     { 
      if(value != Progress) 
      { 
       _Progress = value; 

       NotifyPropertyChanged(); 
      } 
     } 
    } 
} 

MainWindow.xml

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" 
    DataContext="{StaticResource ResourceKey=ViewModel_MainWindow}"> 
<Grid> 
    <ProgressBar Value="{Binding Progress}" Minimum="0" Maximum="50" /> 
</Grid> 

И App.xaml:

<Application x:Class="WpfApplication1.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     StartupUri="MainWindow.xaml" 
     xmlns:local="clr-namespace:WpfApplication1" > <!--change the namespace to the one where you ViewModel is--> 
<Application.Resources> 
    <local:MainWindowViewModel x:Key="ViewModel_MainWindow" /> <!--important--> 
</Application.Resources> 

+0

Я забыл загрузить работу в фоновый поток. Теперь он работает, как и ожидалось, спасибо! – user3292642

Смежные вопросы