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));