2012-01-27 21 views
5

ViewModel'imden Gözlemlenebilir Veri Toplamasını, Görünümdeki Devexpress 2D Hisse Senaryosuna bağlamaya çalışıyorum. VM'nin View'ın DataContext'sini bağladığını biliyorum çünkü pencerenin Sanal Makinedeki bir özelliğe bağlı Başlığı var ve programı çalıştırdığımda doğru. Koleksiyon doğru bir şekilde oluşturuldu, tüm nesnelerin oluşturulduğunu, değerlere sahip olduğunu ve koleksiyona eklendiğini görebiliyorum.DevExpress'e Bağlanma StockSeries2D Grafiği

Grafik bilgileri henüz görüntülenmiyor. Grafik, kendisine bağlı olması gereken bilgileri gösterir. Sanırım XAML'imde bir çizgi ile ilgisi var ama ne olduğunu bilmiyorum. İşte

Çıktı Hata geçerli:

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

DevExpress sürüm 10.1.9

DÜZENLEME geçerli: Ben problem de geldiğini biliyorum. StockSeries2D DataContext = DevExpress.Xpf.Charts.ChartElementPanel yüzden Gerçekten DevExpress.Xpf.Charts.ChartElementPanel işaret

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

kullanmak ve bir Anlık özelliği içermiyor çünkü hata atıldığında.

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

Görünüm:

public partial class MainWindow : Window 
{ 
    private MainWindowViewModel _vm; 


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

Uygulama:

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

cevap

5

Anladım. StockSeries2D ait DataContext'i Window

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

ait DataContext işaret olmadığından ben

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

Pencere DataContext'i kullanmak DataSource ayarlamak için gerekli