Изменение осей на графике диаграмм инструментария WPF вызывает исключение - PullRequest
3 голосов
/ 14 декабря 2011

У меня есть диаграмма инструментария WPF, в которой я хочу указать диапазон осей и изменить отображаемые данные. Любая из этих функций отлично работает независимо, но когда я их соединяю, я получаю исключение из кода привязки, потому что минимальная и максимальная ось ненадолго меняются местами.

Вот код:

<Common:MultiSeriesChart SeriesSource="{Binding Data}" >
  <chartingToolkit:Chart.Axes>
    <chartingToolkit:LinearAxis
            Orientation="X" Minimum="{Binding MinimumMass}" Maximum="{Binding MaximumMass}"/>
    <chartingToolkit:LinearAxis
            Orientation="Y" Minimum="0" Maximum="100"/>
  </chartingToolkit:Chart.Axes>
</Common:MultiSeriesChart>

И код в ViewModel (довольно стандартный материал MVVM):

    private double maximumMass;
    public double MaximumMass
    {
        get { return maximumMass; }
        set
        {
            if (maximumMass != value)
            {
                maximumMass = value;
                RaisePropertyChanged(() => MaximumMass);
            }
        }
    }

    private double minimumMass;
    public double MinimumMass
    {
        get { return minimumMass; }
        set
        {
            if (minimumMass != value)
            {
                minimumMass = value;
                RaisePropertyChanged(() => MinimumMass);
            }
        }
    }

Когда я изменяю рисуемые данные, мне нужно обновить MinimumMass и MaximumMass для оси X. Сначала я обновляю MinimumMass до нового значения, затем MaximumMass. Это нормально, если только новое значение MinimumMass не больше старого значения MaximumMass, после чего код привязки на графике вызывает исключение InvalidOperationException: The minimum value must be smaller than or equal to the maximum value.

Я мог бы обновить их в обратном порядке, но тогда я получу ту же проблему в обратном порядке. Кто-нибудь знает правильный способ справиться с этим без ужасного клуджа, чтобы гарантировать, что максимум временно слишком велик, чтобы его можно было побить (т.е. установите максимум на double.MaxValue, затем установите минимум на новый минимум, затем максимум на новый максимум)?

Ответы [ 2 ]

3 голосов
/ 10 мая 2012

В итоге я просто проверил заказ, прежде чем присвоить новое значение:

if (newMin > MaximumMass)
{
    MaximumMass = newMax;
    MinimumMass = newMin;
}
else
{
    MinimumMass = newMin;
    MaximumMass = newMax;
}
0 голосов
/ 15 декабря 2011

Используй попробуй и поймай

try
{
   min = a;
   max = b;
}
catch(exception)
{
   // reassign values here for min, max
   min = a;
   max = b;
}

Удачи!

...