【问题标题】:Attach event handlers to controls within a data template将事件处理程序附加到数据模板中的控件
【发布时间】:2011-03-29 02:48:01
【问题描述】:

我在 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。

【问题讨论】:

  • 这很奇怪 - 我可以通过更改绑定 Maximum 的值来更新进度条。您是否在 setter 中提高 PropertyChanged ?您使用的是哪个 .NET 版本?
  • 如果你想看看我的测试项目,你可以下载它——docs.google.com/…
  • @Andrew 可能您的绑定中有错字 - 我认为正确的绑定路径可能是 ServerJob.FileSize 而不是 SeverJob.FileSize。
  • @Sergii - 已修复,谢谢。
  • @Greg Sansom - 是的,绑定最大值在该示例中有效。我将不得不进一步调查这个错误。我现在已经更新了问题。

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


【解决方案1】:

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

【讨论】:

  • 嗯。我写了一个更简单的测试应用程序,你在写,它可以工作。我已经为“ServerJob”属性实现了 INotifyPropertyChanged。 (不适用于 ServerJob.FileSize 属性作为每个服务器作业的值常量。)我还在 FileSize 的 getter 上设置了一个断点,WPF 框架确实在查询它。这让我们不知道为什么我会遇到这个错误。
猜你喜欢
  • 2011-05-12
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多