2012-01-27 9 views
5

Próbuję powiązać ObservableCollection danych z mojego ViewModel do wykresu zapasów 2D Devexpress w widoku. Wiem, że maszyna wirtualna jest powiązana z DataContext widoku, ponieważ mam tytuł okna związany z właściwością w maszynie wirtualnej i jest prawidłowy po uruchomieniu programu. Kolekcja jest poprawnie utworzona, widzę, że wszystkie obiekty są tworzone, mają wartości i są dodawane do kolekcji.Wiązanie z DevExpress StockSeries2D Chart

Informacja na temat wykresu nie jest wyświetlana. Wykres pokazuje nie tylko informacje, które mają być z nim związane. Zgaduję, że ma to związek z linią w moim XAML, ale po prostu nie wiem, co to jest.

Oto Błąd na wyjściu:

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

Wersja DevExpress jest 10.1.9

EDIT: Chyba wiem, gdzie problem jest w najbliższych na. StockSeries2D DataContext = DevExpress.Xpf.Charts.ChartElementPanel Więc kiedy używam

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

To naprawdę wskazuje na DevExpress.Xpf.Charts.ChartElementPanel a ponieważ nie zawiera właściwość Migawki błąd zostanie rzucony.

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

Widok:

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

Odpowiedz

5

Rozgryzłem to. Ponieważ DataContext z StockSeries2D nie wskazuje na DataContext w Oknie

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

Musiałem ustawić DataSource użyć okna za DataContext

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