2016-08-15 26 views
0

私はWPFアプリケーションでプログレスバーを実装しようとしています。Progerssbarは更新されません

私のViewModelには新しいプロパティまし

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

だから私は私の見解に1を追加しました:

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

私のロードコマンドを実行し、それがロードされたファイルごとに生成されるイベントを発生させます。 そして、このイベントのEventHandlerは、このような「CurrentProgress」プロパティに1を追加します。

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

しかし、私はバーの上の任意の進捗状況が表示されません。誰かが私が間違っていることを見ていますか? ありがとうございます!

+0

あなたは、UIスレッドで作業を行っています。 UIスレッドは、作業中にUIを更新することはできません。スレッドを使用してファイルをロードしています。 – Will

答えて

1

問題の再現を試みましたが、ここでうまくいきました。

とにかく、あなたが続くことができるいくつかのステップがあります:

  1. を使用すると、UIスレッド上のファイルをロードしていないことを確認してください。もしあなたがそうであれば、「長いタスクを実行している間の進行状況を表示」thisの記事をご覧ください。

  2. があなたのWindowDataContextが正しいことを確認してください、あなたのViewModelSystem.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

関連する問題