2012-01-27 24 views
5

Tôi đang cố gắng liên kết một ObservableCollection dữ liệu từ ViewModel của tôi với Biểu đồ Chứng khoán Devexpress 2D trong Chế độ xem. Tôi biết rằng VM bị ràng buộc làm DataContext của View bởi vì tôi có tiêu đề của cửa sổ ràng buộc với một tài sản trong VM và nó là chính xác khi tôi chạy chương trình. Bộ sưu tập được khởi tạo chính xác, tôi có thể thấy rằng tất cả các đối tượng được tạo, có các giá trị và được thêm vào bộ sưu tập.Binding để DevExpress StockSeries2D Biểu đồ

Thông tin biểu đồ không hiển thị. Biểu đồ chỉ hiển thị không phải thông tin được cho là ràng buộc với nó. Tôi đoán nó đã làm với một dòng trong XAML của tôi nhưng tôi chỉ không biết nó là gì.

Đây là báo lỗi từ nhà 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')

Phiên bản DevExpress là 10.1.9

EDIT: Tôi nghĩ rằng tôi biết nơi mà vấn đề là đến trong lúc. Các StockSeries2D DataContext = DevExpress.Xpf.Charts.ChartElementPanel Vì vậy, khi tôi sử dụng

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

Nó thực sự chỉ vào DevExpress.Xpf.Charts.ChartElementPanel và vì nó không chứa một tài sản Snapshots lỗi được ném.

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

Xem:

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

Trả lời

5

Tôi đã tìm ra. Kể từ DataContext của StockSeries2D không trỏ đến DataContext của Window

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

tôi cần phải thiết lập các DataSource để sử dụng DataContext của Window

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

Các vấn đề liên quan