2012-01-27 21 views
5

Sto tentando di associare una ObservableCollection di dati dal mio ViewModel alla tabella stock 2D Devexpress nella vista. So che la VM è vincolata al DataContext della vista perché ho il titolo della finestra associato a una proprietà nella VM ed è corretto quando eseguo il programma. La raccolta è stata istanziata correttamente, posso vedere che tutti gli oggetti sono creati, hanno valori e sono aggiunti alla collezione.Associazione a DevExpress StockSeries2D Chart

L'informazione del grafico non viene visualizzata. Il grafico mostra solo le informazioni che dovrebbero essere associate ad esso. Immagino che abbia a che fare con una linea nel mio XAML, ma non so cosa sia.

Qui è l'errore dal Output:

System.Windows.Data Error: 40 : BindingExpression path error: 'Snapshots' property not found on 'object' ''ChartElementPanel' (Name='')'. BindingExpression:Path=DataContext.Snapshots; DataItem='ChartElementPanel' (Name=''); target element is 'StockSeries2D' (HashCode=24500892); target property is 'DataSource' (type 'Object')

La versione DevExpress è 10.1.9

EDIT: Credo di sapere dove il problema è in arrivo a. Lo StockSeries2D DataContext = DevExpress.Xpf.Charts.ChartElementPanel Così, quando io uso

DataSource="{Binding Path=DataContext.Snapshots}" 

E 'davvero punta alla DevExpress.Xpf.Charts.ChartElementPanel e dal momento che non contiene una proprietà istantanee è gettato l'errore.

XAML:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="200" /> 
     <RowDefinition Height="50" /> 
    </Grid.RowDefinitions> 
    <dxc:ChartControl Name="chartControl1"> 
     <dxc:ChartControl.Diagram> 
      <dxc:XYDiagram2D> 
       <dxc:XYDiagram2D.Series> 
        <dxc:StockSeries2D DataSource="{Binding DataContext.Snapshots}" HighValueDataMember="High" LowValueDataMember="Low" CloseValueDataMember="Last" ArgumentScaleType="DateTime" ArgumentDataMember="TimeStamp"> 

         <dxc:StockSeries2D.PointOptions> 
          <dxc:PointOptions dxc:FinancialSeries2D.ValueToDisplay="HighValue" /> 
         </dxc:StockSeries2D.PointOptions> 

         <dxc:StockSeries2D.Model> 
          <dxc:ArrowsStock2DModel /> 
         </dxc:StockSeries2D.Model> 
        </dxc:StockSeries2D> 
       </dxc:XYDiagram2D.Series> 

       <!--Region #Axis X--> 
       <dxc:XYDiagram2D.AxisX> 
        <dxc:AxisX2D> 
         <dxc:AxisX2D.DateTimeOptions> 
          <dxc:DateTimeOptions Format="ShortTime" /> 
         </dxc:AxisX2D.DateTimeOptions> 
        </dxc:AxisX2D> 
       </dxc:XYDiagram2D.AxisX> 
       <!-- End Rgion --> 

       <!-- region #AxisY --> 
       <dxc:XYDiagram2D.AxisY> 
        <dxc:AxisY2D> 
         <dxc:AxisY2D.Range> 
          <dxc:AxisRange dxc:AxisY2D.AlwaysShowZeroLevel="False" /> 
         </dxc:AxisY2D.Range> 
        </dxc:AxisY2D> 
       </dxc:XYDiagram2D.AxisY> 

       <!--End Rgion--> 
      </dxc:XYDiagram2D> 
     </dxc:ChartControl.Diagram> 
    </dxc:ChartControl> 
</Grid> 

ViewModel:

public class MainWindowViewModel : INotifyPropertyChanged 
{ 
    ObservableCollection<ISnapShot> _snapShots; 
    string _windowTitle; 

    public MainWindowViewModel() 
    { 
     _snapShots = new ObservableCollection<ISnapShot>(); 
     LoadSnapshots(); 
     WindowTitle = Snapshots.First().Symbol; 
    } 

    public ObservableCollection<ISnapShot> Snapshots 
    { 
     get { return _snapShots; } 
    } 

    public String WindowTitle 
    { 
     get { return _windowTitle; } 
     set { _windowTitle = value; OnPropertyChanged("WindowTitle"); } 
    } 

    private void AddSnapshot(ISnapShot snapshot) 
    { 
     _snapShots.Add(snapshot); 
    } 

    private void LoadSnapshots() 
    { 
     int counter = 0; 

     while (counter < 5) 
     { 
      ISnapShot s = new Snapshot() 
      { 
       TimeStamp = DateTime.Now, 
       Symbol = "XYZ", 
       High = (counter + 1) * 5, 
       Low = (counter + 1) * 2, 
       Last = (counter + 1) * 3 
      }; 

      _snapShots.Add(s); 
      counter++; 
      Thread.Sleep(1000); 
     } 

    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    void OnPropertyChanged(string prop) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
    } 
} 

Vista:

public partial class MainWindow : Window 
{ 
    private MainWindowViewModel _vm; 


    public MainWindow(MainWindowViewModel vm) 
    { 
     InitializeComponent(); 
     _vm = vm; 
     this.DataContext = _vm; 
    } 
} 

App:

public partial class App : Application 
{ 
    private void OnStartup(object sender, StartupEventArgs e) 
    { 
     MainWindowViewModel vm = new MainWindowViewModel(); 
     Views.MainWindow view = new Views.MainWindow(vm); 
     view.Show(); 
    } 
} 

risposta

5

L'ho capito. Dal momento che il DataContext di StockSeries2D non punta il DataContext della finestra

<dxc:StockSeries2D DataContext="DevExpress.Xpf.Charts.ChartElementPanel"

avevo bisogno di impostare il DataSource per usare DataContext della Window

<dxc:StockSeries2D DataSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Snapshots}"