У меня есть список в WPF, в котором отображается состояние ряда рабочих потоков. На дисплее отображается индикатор выполнения.
Оказывается, что у индикаторов выполнения есть проблема (дефект?): Значение «Maximum» является свойством зависимости, но индикатор выполнения не обновляется при изменении этого свойства.
Кто-то включил подобную проблему в этот вопрос . Предлагаемое решение состоит в том, чтобы добавить в индикатор выполнения обработчик, который обрабатывает изменение свойства зависимостей.
Но мой индикатор прогресса создается платформой 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, и среда действительно запрашивала размер файла в ответ на имущество изменено уведомление.
Я также добавил два элемента TextBlocks к элементу управления, привязанных к ServerJob.FileSize и BytesUploaded соответственно. И они обновляются именно так, как и должны.
Но по какой-то причине, как только значение BytesUploaded станет ненулевым, индикатор выполнения увеличится до 100%.
Я обошел проблему, добавив новое свойство "PercentageComplete", которое вычисляет прогресс, и таким образом я могу сохранить максимум при постоянном значении 100.