Возможная ошибка привязки данных на индикаторе выполнения при изменении текста данных (Silverlight 4) - PullRequest
3 голосов
/ 23 июля 2010

У меня есть индикатор выполнения, привязанный к 2 целочисленным значениям - одно - общее количество секунд, а другое - оставшиеся секунды (отсчет по таймеру: всегда <= общее количество секунд). </p>

У меня есть набор данных LayoutRoot для моего объекта верхнего уровня (для которого BlindSet является свойством - см. Код).

Когда я запускаю проект, индикатор выполнения обновляется идеально. Отсчитывает количество секунд, как и ожидалось. Затем я изменяю текст данных, создавая новый объект и устанавливая его в класс BlindSet. Я использую события уведомления DataChanged, чтобы пользовательский интерфейс знал, что он изменился. Это также хорошо работает - все остальные элементы управления, кроме индикатора прогресса, обновляются соответствующим образом.

Это сбило меня с толку, поэтому я упростил это до:

2 текстовых блока и индикатор выполнения, все привязаны к одним и тем же значениям. Текст данных установлен выше, поэтому он одинаков для всех.

В текстовых блоках отображаются правильные значения при обратном отсчете. (BlindSet.TimeLeftInCurrentBlind.TotalSeconds ведет обратный отсчет по таймеру), но индикатор выполнения никогда не обновляется после изменения текстового контекста. Я даже попытался повторно связать его после изменения текста данных, но это не помогло.

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

Либо я делаю что-то действительно глупое (возможно;), либо это ошибка в элементе управления индикатора выполнения.

XAML:

<TextBlock Text="{Binding BlindSet.CurrentBlind.SecondsPerBlind}"  />
<TextBlock Text="{Binding BlindSet.TimeLeftInCurrentBlind.TotalSeconds}" />

<ProgressBar Minimum="0" Maximum="{Binding BlindSet.CurrentBlind.SecondsPerBlind}" Value="{Binding BlindSet.TimeLeftInCurrentBlind.TotalSeconds}" ToolTipService.ToolTip="{Binding BlindSet.TimeLeftInCurrentBlind.SecondsPerBlind}" />

Код:

LayoutRoot.DataContext = tournament;

турнир имеет объект BlindSet, но я не думаю, что это является частью проблемы, так как другие элементы управления обновляются нормально:

  public Blindset BlindSet
    {
        get { return blindset; }
        set
        {
            if (blindset != value)
            {
                blindset = value;
                OnPropertyChanged("BlindSet");
                OnPropertyChanged("CurrentBlind");
            }
        }
    }

Обновление : Возможно, существует некоторое внутреннее состояние, которое необходимо повторно инициализировать с новыми значениями max и value при изменении текста данных (значения сильно различаются, например, 1200 секунд или 120 секунд).

Когда я связываюсь с новым объектом BlindSet с теми же значениями (например, 1200 секунд), тогда он работает, как и ожидалось - поэтому я думаю, что мне нужно как-то дать ему толчок, чтобы пересчитать изменения малого или большого значения - любая идея, как ?!

Ответы [ 2 ]

2 голосов
/ 23 июля 2010

Я только что прочитал это в разделе комментариев статьи блога , надеюсь, это поможет.

Просто так, чтобы все знали.ProgressBar (по крайней мере, начиная с Silverlight 3 сентября 2009 г.) не очень хорошо работает с привязкой данных.Это только частично работает.Поэтому вы можете учитывать это в своем проекте до тех пор, пока он не будет исправлен.
1) Невозможно изменить DataContext, не изменив сначала значение Null.Таким образом, унаследованные привязки обычно не работают.
2) Видимость не может быть привязана к данным.(Вы можете попробовать, но это всегда работает так, как будто вы установили Mode = OneTime)
3) Другие привязки тоже не всегда стабильны ...
Надежда, которая помогает кому-то избежать разочарования.

0 голосов
/ 23 июля 2010

Итак, если вы реализуете INotifyPropertyChanged для объекта, вы должны указать, что "public Blindset BlindSet" и что каждое из свойств в экземпляре "BlindSet" меняется ... Правильно ли вам также нужноиспользовать для этого двустороннюю привязку, или я думаю о входных значениях?


Чтобы сделать это более понятным ... каждое из свойств BlindSet.CurrentBlind. {property here} должно объявить, что онотакже изменилось, и свойство BlindSet.CurrentBlind должно сообщить о его изменении.

...