我在WPF中有一个列表框,显示了许多工作线程的状态。显示中包含一个进度条。
事实证明进度条存在问题(缺陷?):“最大”值是依赖项属性,但当此属性更改时,进度条不会更新。
有人在this question中列出了类似的问题。建议的解决方案是向处理依赖项属性更改的进度条添加处理程序。
但我的进度条是由WPF框架通过数据模板创建的。 (请参阅下面的代码)如何将处理程序附加到这些动态创建的进度条?
或者,有没有其他方法可以解决这个问题?
<DataTemplate x:Key="DataTemplateTransferWorker">
<Border Style="{StaticResource TransferWorker}" Height="Auto">
<StackPanel Orientation="Vertical">
<TextBlock Style="{StaticResource ItemHeader}">Transfer Worker</TextBlock>
<TextBlock Style="{StaticResource FieldValue}" Text="{Binding StatusDescription}" />
<!-- Note that the maximum comes from a changing property. -->
<ProgressBar
Margin="6, 3, 6, 3"
Height="12"
Orientation="Horizontal"
Background="Transparent"
Maximum="{Binding ServerJob.FileSize, Mode=OneWay}"
Value="{Binding BytesUploaded, Mode=OneWay}" />
<小时/> 稍后修改
事实证明,它并不像最大绑定值那样简单,因为有一些工作示例可以很好地动态更新进度条。
这不是INotifyPropertyChanged问题。我正在通知ServerJob属性的任何更改,(但不是每个服务器作业都是常量的ServerJob.FileSize属性。)我还在ServerJob.FileSize.get上放置了一个断点,框架确实在回复时查询了文件大小到财产变更通知。
我还向控件添加了两个TextBlock,分别绑定到ServerJob.FileSize和BytesUploaded。他们完全按照自己的意愿更新。
但由于某些原因,只要BytesUploaded值变为非零,进度条就会缩放到100%。
我通过添加一个计算进度的新属性“PercentageComplete”解决了这个问题,这样我就可以将最大值保持在100的恒定值。
答案 0 :(得分:1)
我尝试在ProgressBar
中创建一个DataTemplate
的应用,其Maximum
绑定到不断变化的属性。像Greg Sansom一样,我没有遇到任何问题,我想你没有在包含你所绑定属性的类中实现INotifyPropertyChanged
,这样做应该是解决问题的最简单方法。