WPF C# MVVM文件上传进度条报错:string类型无Value属性
解决WPF文件上传进度条绑定错误的问题
这个错误的根源很清晰——你把进度条绑定的属性类型搞错了,而且在ViewModel里还试图访问一个string类型的Value属性,这自然会报错。咱们一步步来修正:
1. 修正Model中进度属性的类型
ProgressBar的Value属性要求的是数值类型(默认是double),但你把progressBar1定义成了string类型,这不仅绑定会失效,代码里访问它的Value属性更是无稽之谈。
把Model里的属性改成double类型,同时遵循C#命名规范(属性名首字母大写):
private double _progressBarValue; public double ProgressBarValue { get { return _progressBarValue; } set { _progressBarValue = value; OnPropertyChanged(nameof(ProgressBarValue)); } }
(用nameof代替硬编码字符串,能避免拼写错误,让代码更健壮)
2. 修正XAML中的绑定
把ProgressBar的Value绑定到新的数值属性上,保持OneWay模式就足够了:
<ProgressBar HorizontalAlignment="Left" Height="30" Margin="145,6,0,0" VerticalAlignment="Top" Width="469" Value="{Binding ProgressBarValue, Mode=OneWay}" Grid.Row="1" />
(UpdateSourceTrigger=PropertyChanged在这里可以省略,因为OneWay绑定下,进度条只需要监听源的变化,不需要反向更新源)
3. 修正ViewModel中的worker_ProgressChanged方法
现在你不需要再去访问不存在的progressBar1.Value了,直接给Model的ProgressBarValue赋值就行。比如假设后台线程返回的进度是0-100的数值:
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { // 假设e.ProgressPercentage是0-100的进度值 FilesDetails.ProgressBarValue = e.ProgressPercentage; }
为什么之前会报错?
string类型本身没有Value属性,所以你写FilesDetails.progressBar1.Value时,编译器找不到这个成员,直接抛出错误。- 就算你不访问
Value,把string绑定到ProgressBar的Value属性也会因为类型不匹配导致绑定失效,进度条根本不会更新。
这样调整之后,进度条就能正常跟着上传进度同步更新了。
内容的提问来源于stack exchange,提问作者jerry jose
相关产品推荐
相关产品推荐

