Обязательное обновление добавляет серию новостей в таблицу WPF Toolkit (вместо замены / обновления серии) - PullRequest
3 голосов
/ 14 июня 2010

В настоящее время я перекодирую столбчатую диаграмму в своем приложении, чтобы использовать класс Chart в WPF Toolkit . Используя MVVM, я связываю ItemsSource из ColumnSeries в моем графике со свойством моей модели представления. Вот соответствующий XAML:

<charting:Chart>
  <charting:ColumnSeries ItemsSource="{Binding ScoreDistribution.ClassScores}"
                         IndependentValuePath="ClassName" DependentValuePath="Score"/>
</charting:Chart>

И свойство на viewmodel:

// NB: viewmodel derived from Josh Smith's BindableObject
public class ExamResultsViewModel : BindableObject
{
    // ...

    private ScoreDistributionByClass _scoreDistribution;
    public ScoreDistributionByClass ScoreDistribution
    {
        get
        {
            return _scoreDistribution;
        }
        set
        {
            if (_scoreDistribution == value)
            {
                return;
            }

            _scoreDistribution = value;

            RaisePropertyChanged(() => ScoreDistribution);
        }
    }

Однако, когда я обновляю свойство ScoreDistribution (устанавливая его для нового объекта ScoreDistribution), диаграмма получает дополнительную серию (на основе нового ScoreDistribution), а также сохраняет оригинальная серия (на основе предыдущего ScoreDistribution).

Чтобы проиллюстрировать это, вот пара скриншотов, показывающих диаграмму перед обновлением (с одной точкой данных в ScoreDistribution.ClassScores) и после нее (теперь с 3 точками данных в ScoreDistribution.ClassScores):

With a single data point

With 2 more data points added - note the original wide bar behind them

Теперь я понимаю, что есть и другие способы сделать это (например, изменить содержимое исходного ScoreDistribution объекта, а не заменить его полностью), но я не понимаю, почему он идет не так в его текущей форме. Кто-нибудь может помочь?

Ответы [ 4 ]

2 голосов
/ 14 января 2013

Самый простой способ избежать этой проблемы - привязать серию ItemSource с IsAsync к True.

ItemsSource="{Binding DataItems, IsAsync=True}"
2 голосов
/ 15 августа 2012

У меня была такая же проблема. При изменении ItemsSource объекта DataPointSeries получилось, что старые DataPoints не были удалены с диаграммы.

Мой обходной путь в WPF Toolkit (DataPointSeries.cs) ...

A for вместо foreach цикла в LoadDataPoints(), потому что мы меняем коллекцию:

for (int i = oldItems.Count - 1; i >= 0; i--)

Измените if в OnDataPointStateChanged() на:

if (dataPoint.State == DataPointState.Hidden || dataPoint.State == DataPointState.PendingRemoval)

Таким образом DataPoint будет немедленно удален.

Редактировать
Мне также пришлось отключить анимацию DataPoint, описанную здесь .

1 голос
/ 13 июля 2010

Оказывается, проблема была вызвана частотой обновлений в диаграмме, а не тем фактом, что была заменена вся серия; изменение свойства базы данных на ObservableCollection не имеет значения.

В итоге мы изменили наш код, чтобы включить задержку между изменениями в базовых данных и теми изменениями, которые отражаются в свойстве связанной коллекции ViewModel. Хотя это в некоторой степени зависит от скорости компьютера, на котором запущено приложение, мы установили задержку в 0,5 с между последним изменением данных и обновлением свойства ViewModel. Это предотвращает обновление диаграммы чаще, чем каждые 0,5 сек, и, похоже, делает эту работу.

В какой-то момент я на самом деле пройду код WPFToolkit и посмотрю, что я могу сделать, чтобы это исправить, но сейчас этот обходной путь стоит отметить.

0 голосов
/ 16 июня 2010

То, что вы делаете, должно работать. Тот факт, что это не означает, что WPF Toolkit содержит ошибку.

WPF Toolkit реализует OnItemsSourceChanged () в DataPointSeries, чтобы обнаружить случай, когда вы заменяете ItemsSource и вызываете Refresh (). Refresh () содержит код для удаления всех точек данных (кроме тех, которые уже анимируются), а затем создает новый набор DataPoints. Очевидно, что в этом коде есть ошибка. Я смотрел на это пару минут, но не понял, что случилось. Я бы начал с обновления до последней версии WPFToolkit. Если это не помогает, вы можете пройти через метод DataPointSeries.Refresh () при изменении ItemsSource, чтобы увидеть, что там происходит и почему он не удаляет старые объекты DataPoint.

Или, как вы заметили, вы можете обойти эту ошибку, просто заменив содержимое коллекции вместо коллекции в целом.

...