C# 进度条未更新

C# 进度条未更新,c#,wpf,mvvm,binding,progress-bar,C#,Wpf,Mvvm,Binding,Progress Bar,我在列表视图中的{Binding CurrentProgress}控件的值有问题。在我的代码中,我能够添加一些具有CurrentProgress属性的项目。项目以适当的方式添加,但只有一个progressbar的更新。代码如下: 型号: sealed public class Mp3Model : INotifyPropertyChanged { public string Name { get; set; } private double _currentProgress;

我在
列表视图
中的
{Binding CurrentProgress}
控件的
值有问题。在我的代码中,我能够添加一些具有
CurrentProgress
属性的项目。项目以适当的方式添加,但只有一个progressbar的更新。代码如下:

型号:

sealed public class Mp3Model : INotifyPropertyChanged
{
    public string Name { get; set; }

    private double _currentProgress;
    public double CurrentProgress
    {
        get
        {
            return _currentProgress;
        }
        set
        {
            _currentProgress = value;
            OnPropertyChanged("CurrentProgress");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
XAML:

ProgressBar绑定值的位置:

progressStream.BytesMoved += (sender, args) =>
{
    currentLocalProgress = args.StreamLength * 100 / streamLength;
    _model.CurrentProgress = currentLocalProgress;
    Debug.WriteLine($"{_model.CurrentProgress}% of video downloaded");
};

有人知道吗

xaml
看起来不错,但我也有类似的问题,我修复如下:

Mode=OneWay
添加到
值=“{Binding CurrentProgress,Mode=OneWay}”

无论何时更新
CurrentProgress
都使用调度程序:
Application.Current.Dispatcher.Invoke(()=>CurrentProgress++)

我希望它能帮助你找到解决办法

编辑:只是一个建议,我在PropertyChanged上使用了下面的
OnPropertyChanged
,所以您不必每次都写属性的名称=D

protected void OnPropertyChange([CallerMemberName] string inPropertyName = null) =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(inPropertyName));

xaml
在我看来很正常,但我也遇到了类似的问题,我修复了以下问题:

Mode=OneWay
添加到
值=“{Binding CurrentProgress,Mode=OneWay}”

无论何时更新
CurrentProgress
都使用调度程序:
Application.Current.Dispatcher.Invoke(()=>CurrentProgress++)

我希望它能帮助你找到解决办法

编辑:只是一个建议,我在PropertyChanged上使用了下面的
OnPropertyChanged
,所以您不必每次都写属性的名称=D

protected void OnPropertyChange([CallerMemberName] string inPropertyName = null) =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(inPropertyName));

尝试猜测:您更新了一个_model字段,该字段将在每次调用save video to disk方法时被覆盖。只有当类的实例只能执行此方法的一个调用时(但由于我们没有clas,我们不知道是列表还是视频),这可能才有效


所以我想说,调用两次该方法会阻止第一个_模型实例被更新(因为lambda捕获了保存该对象的变量)

尝试猜测:您更新了一个_模型字段,该字段将在每次调用save video to disk方法时被覆盖。只有当类的实例只能执行此方法的一个调用时(但由于我们没有clas,我们不知道是列表还是视频),这可能才有效


因此,我想说调用两次该方法会阻止第一个_模型实例被更新(因为lambda捕获了保存该对象的变量)

这是相当多的代码。你能把它简化成一个简单的句子吗?它将帮助其他人帮助您。Mp3List必须是一个ObservableCollection,并且将项添加到字段而不是属性本身的操作(
此操作)。\u Mp3List.add(\u model);
)不会触发Notify属性更改,是吗?请注意,INotifyPropertyChanged绑定会自动对您进行马歇尔调用。因此,在从后台线程更新其中一个属性时,您不必担心使用Invoke。你能把它简化成一个简单的句子吗?它将帮助其他人帮助您。Mp3List必须是一个ObservableCollection,并且将项添加到字段而不是属性本身的操作(
此操作)。\u Mp3List.add(\u model);
)不会触发Notify属性更改,是吗?请注意,INotifyPropertyChanged绑定会自动对您进行马歇尔调用。因此,当从后台线程更新其中一个属性时,您不必担心使用Invoke。。。这个答案解决了我的问题。我觉得很愚蠢,我看不出来。所以我所做的。。是我;每次启动SaveVideoToDisk()方法时,我都会创建一个全新的实例。谢谢。致以最良好的问候。谢谢你,伙计。。。这个答案解决了我的问题。我觉得很愚蠢,我看不出来。所以我所做的。。是我;每次启动SaveVideoToDisk()方法时,我都会创建一个全新的实例。谢谢。顺致敬意,
protected void OnPropertyChange([CallerMemberName] string inPropertyName = null) =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(inPropertyName));