WPF数据绑定的进度条未显示进度

5
我在处理 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));
    }

进度条一开始就是“满”的,并在整个过程中保持这种状态。我已经阅读了所有相关的SO帖子,但没有运气。我做错了什么吗?提前感谢您。

我猜WorkerOnDoWork在除UI线程之外的线程上运行。如果是这样,我认为这不是很安全,因为你将有两个线程访问同一件事情。 - Steve
1个回答

6

你也需要绑定你的最大值:


    <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"/>

呼...我花了一个小时 :). 下次也许我应该早点发一个问题。非常感谢!(等SO允许时会接受) - bas
@Reed,Maximum/Minimum是自动属性。如果源正在执行推送并且视图不需要推送,为什么UpdateSourceTrigger=PropertyChanged?而且根本没有setter来回答推送? - Gayot Fow
@GarryVass 这是接口而不是实现 - 我假设它们不是自动属性,而是像当前值一样实现INotifyPropertyChanged。 - Reed Copsey
@ReedCopsey,+1 现在没问题了。视图中没有发生需要更新源的情况。同时也感谢您快速的回复! - Gayot Fow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接