2013-11-04 41 views
3

我有進入工作欄的麻煩。WPF數據綁定ProgressBar沒有顯示進度

XAML:

<ProgressBar x:Name="ProgressBar" Value="{Binding Progress, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="37" Margin="10,35,0,0" VerticalAlignment="Top" Width="590"/> 

後面的代碼:

ProgressBar.DataContext = progressModel; 

IProgressModel:

public interface IProgressModel 
{ 
    double Minimum { get; set; } 
    double Maximum { get; set; } 
    double Progress { get; } 
} 

實現:

private void WorkerOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs) 
    { 
     Minimum = 0; 
     Maximum = RenamableFiles.Count; 

     var i = 0; 
     foreach (var renamableFile in RenamableFiles) 
     { 
      var oldFilename = ReCreateOldFileName(renamableFile); 
      var renameProposalFilename = CreateNewFileName(renamableFile); 

      if (oldFilename != null && renameProposalFilename != null && !oldFilename.Equals(renameProposalFilename)) 
      { 
       // File.Move(oldFilename, renameProposalFilename); 
       Thread.Sleep(100); 
       Progress = i++; 
      } 
     } 
    } 

和漂亮的直線前進的PropertyChanged機制:

private double _progress; 
    public double Progress 
    { 
     get { return _progress; } 
     set 
     { 
      _progress = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

進度條開始「滿」並保持整個過程的方式。我已閱讀所有相關的線索,但沒有運氣。

我在做什麼錯?

Thx提前。

+0

我猜'WorkerOnDoWork'運行在比UI線程以外的線程。如果是這樣,我不認爲這是非常安全的,因爲你將有兩個線程訪問相同的東西。 – Steve

回答

4

您需要將最大綁定,太:

<ProgressBar x:Name="ProgressBar" 
     Value="{Binding Progress}" 
     Maximum="{Binding Maximum}" 
     Minimum="{Binding Minimum}" 
     HorizontalAlignment="Left" Height="37" Margin="10,35,0,0" 
     VerticalAlignment="Top" Width="590"/> 
+0

pfffff ......我花了一個小時:)。也許我應該在下次提前發表問題。 thx百萬! (SO會允許我接受)​​ – bas

+0

@Reed,最大/最小值是自動屬性。爲什麼UpdateSourceTrigger = PropertyChanged,如果源是抽水,視圖不需要推?而且無論如何也沒有安裝者可以回答這個問題? –

+0

@GarryVass這是接口,而不是實現 - 我假設它們不是自動屬性,並且實現INotifyPropertyChanged,就像當前值一樣。 –