2011-12-14 3 views
2

J'ai un graphique de la boîte à outils WPF que je veux pouvoir à la fois spécifier la plage d'axes et modifier les données affichées. L'une ou l'autre de ces fonctions fonctionne bien indépendamment, mais lorsque je les mets ensemble, une exception est générée par le code de liaison car les axes minimum et maximum sont brièvement inversés.La modification des axes sur le graphique de graphique de la boîte à outils WPF génère une exception

Voici quelques code:

<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> 

Et le code dans le ViewModel (stuff MVVM assez standard):

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); 
      } 
     } 
    } 

Quand je change les données en cours d'élaboration, je dois mettre à jour le MinimumMass et MaximumMass pour l'axe X. Je commence par mettre à jour le MinimumMass à la nouvelle valeur, puis le MaximumMass. Cela est bien moins que la nouvelle valeur MinimumMass est plus grand que l'ancien MaximumMass, à quel point le code de liaison dans le graphique jette un InvalidOperationException: The minimum value must be smaller than or equal to the maximum value.

je pourrais les mettre à jour dans l'ordre inverse, mais je me faisais la même problème à l'envers. Est-ce que quelqu'un sait la bonne façon de traiter cela sans un horrible kludge pour s'assurer que le maximum est temporairement trop grand pour être battu (par exemple, mettre au maximum double.MaxValue, puis définir minimum à nouveau minimum, puis maximum au nouveau maximum)?

Répondre

2

En fin de compte, je viens de vérifier l'ordre avant d'attribuer la nouvelle valeur:

if (newMin > MaximumMass) 
{ 
    MaximumMass = newMax; 
    MinimumMass = newMin; 
} 
else 
{ 
    MinimumMass = newMin; 
    MaximumMass = newMax; 
} 
0

Utilisez essayer d'attraper

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

Bonne chance!

Questions connexes