2009-10-22 8 views
5

Ho utilizzato il controllo grafico di Microsoft del toolkit WPF per scrivere il mio controllo grafico. Ho bloggato su di esso here. Il mio controllo grafico impila gli yax nel grafico uno sopra l'altro. Come puoi leggere nell'articolo, tutto funziona abbastanza bene. Ora voglio creare un viewmodel che controlli i dati e gli assi nel grafico. Finora sono in grado di aggiungere assi al grafico e mostrarli nel grafico. Ma ho un problema quando provo ad aggiungere le linee di produzione perché ha una proprietà DependentAxis e una proprietà InDependentAxis. Non so come assegnare i controlli xAxis e yAxis appropriati ad esso.
Di seguito viene visualizzata una parte di LineSeriesViewModel. Ha una proprietà nidificata XAxisViewModel e YAxisViewModel.Come associare i modelli di visualizzazione nidificati alle proprietà di un controllo

public class LineSeriesViewModel : ViewModelBase, IChartComponent 
{ 

    XAxisViewModel _xAxis; 
    public XAxisViewModel XAxis 
    { 
     get { return _xAxis; } 
     set 
     { 
      _xAxis = value; 
      RaisePropertyChanged(() => XAxis); 
     } 
    } 

    //The YAxis Property look the same 
} 

Tutti i modelli di visualizzazione hanno il proprio datatemplate. Il codice XAML è simile al seguente:

<UserControl.Resources> 
    <DataTemplate x:Key="xAxisTemplate" DataType="{x:Type l:YAxisViewModel}"> 
     <chart:LinearAxis x:Name="yAxis" Orientation="Y" Location="Left" Minimum="0" Maximum="10" IsHitTestVisible="False" Width="50" /> 
    </DataTemplate> 
    <DataTemplate x:Key="yAxisTemplate" DataType="{x:Type l:XAxisViewModel}"> 
     <chart:LinearAxis x:Name="xAxis" Orientation="X" Location="Bottom" Minimum="0" Maximum="100" IsHitTestVisible="False" Height="50" /> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type l:LineSeriesViewModel}"> 
     <!--Binding doesn't work on the Dependent and IndependentAxis! --> 
     <!--YAxis XAxis and Series are properties of the LineSeriesViewModel --> 
     <l:FastLineSeries DependentAxis="{Binding Path=YAxis}" 
          IndependentAxis="{Binding Path=XAxis}" 
          ItemsSource="{Binding Path=Series}"/> 
    </DataTemplate> 
    <Style TargetType="ItemsControl"> 
     <Setter Property="ItemsPanel"> 
      <Setter.Value> 
       <ItemsPanelTemplate> 
        <!--My stacked chart control --> 
        <l:StackedPanel x:Name="stackedPanel" Width="Auto" Height="Auto" Background="LightBlue"> 
        </l:StackedPanel> 
       </ItemsPanelTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ClipToBounds="True"> 
    <!-- View is an ObservableCollection of all axes and series--> 
    <ItemsControl x:Name="chartItems" ItemsSource="{Binding Path=View}" Focusable="False"> 
    </ItemsControl> 
</Grid> 

Questo codice funziona abbastanza bene. Quando aggiungo gli assi vengono disegnati. Ma il DependentAxis e l'InDependentAxis del controllo delle linee restano nulli, quindi la serie non viene disegnata. Come posso associare i modelmodelli nidificati alle proprietà di un controllo?

risposta

0

Dovrebbe funzionare. Alcune cose che puoi controllare:

  • La serie Binding funziona? Se è così, prova a capire qual è la differenza.
  • Sei sicuro che le proprietà XAxis e YAxis abbiano effettivamente valori? Prova a inserire un breakpoint nel getter. Se viene raggiunto, il rilegatura funziona. Puoi anche mettere un convertitore (IValueConverter) sul Binding (che restituisce semplicemente il valore che riceve) e posizionare lì un breakpoint.
  • Usa PresentationTraceSources.TraceLevel = Alto sul collegamento per ottenere più traccia dettagliata (che apparirà nella finestra VS Output).
  • Are DependentAxis/IndependentAxis definiti come proprietà di dipendenza su FastLineSeries?

Speranza che aiuta,

Aelij.

1

Probabilmente lo hai già controllato, ma trovo che quando eseguo il debug dei binding il primo e più semplice punto di partenza è eseguire una sessione di debug da VS poiché l'output di debug indica quali oggetti e proprietà non riescono a collegarsi. Di solito finisco per scoprire che ho bisogno di impostare in modo esplicito un DataContext o qualcos'altro come un errore di battitura. L'uscita di guardare per l'avvio in questo modo:

System.Windows.Data Error: 39 : BindingExpression path error:

questo è seguito dal nome della proprietà si è tentato di legare e di solito la cosa più importante della classe contro cui la sua realtà cercando di legare. Se questo non aiuta c'è un ottimo articolo qui sul binding di debug: http://www.beacosta.com/blog/?p=52 che discute l'uso di PresentationTraceSources.TraceLevel = High di cui Aelij ha parlato, oltre ad alcune altre tecniche. Spero che questo vada nella giusta direzione.

saluti,

Mike

Problemi correlati