将事件处理程序附加到数据模板中的控件

时间:2011-03-29 02:48:01

标签: c# wpf data-binding progress-bar

我在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的恒定值。

1 个答案:

答案 0 :(得分:1)

我尝试在ProgressBar中创建一个DataTemplate的应用,其Maximum绑定到不断变化的属性。像Greg Sansom一样,我没有遇到任何问题,我想你没有在包含你所绑定属性的类中实现INotifyPropertyChanged,这样做应该是解决问题的最简单方法。