Присоедините обработчики событий к элементам управления в шаблоне данных - PullRequest
1 голос
/ 29 марта 2011

У меня есть список в 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.

1 Ответ

1 голос
/ 29 марта 2011

Я пытался создать приложение с ProgressBar в DataTemplate, чье Maximum связано с изменяющимся свойством. Как и в случае с Грегом Сансом, я не сталкиваюсь с какими-либо проблемами, я полагаю, вы не внедрили INotifyPropertyChanged в класс, который содержит свойство, с которым вы связаны, поэтому это должно быть самым простым решением проблемы.

...