【问题标题】:Binding to DevExpress StockSeries2D Chart绑定到 DevExpress StockSeries2D 图表
【发布时间】:2012-01-27 20:31:05
【问题描述】:

我正在尝试将来自 ViewModel 的 ObservableCollection 数据绑定到视图中的 Devexpress 2D 股票图表。我知道 VM 绑定了 View 的 DataContext,因为我将窗口的 Title 绑定到了 VM 中的一个属性,并且在我运行程序时它是正确的。集合已正确实例化,我可以看到所有对象都已创建、具有值并已添加到集合中。

图表信息只是没有显示。该图表显示的只是不应该绑定到它的信息。我猜它与我的 XAML 中的一行有关,但我只是不知道它是什么。

这是来自输出的错误:

System.Windows.Data 错误:40:BindingExpression 路径错误: 在“对象”“ChartElementPanel”上找不到“快照”属性 (名称='')'。 BindingExpression:Path=DataContext.Snapshots; DataItem='ChartElementPanel' (Name='');目标元素是 'StockSeries2D' (HashCode=24500892);目标属性是“数据源” (类型“对象”)

DevExpress 版本是 10.1.9

编辑: 我想我知道问题出在哪里。 StockSeries2D DataContext = DevExpress.Xpf.Charts.ChartElementPanel 所以当我使用

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

它确实指向 DevExpress.Xpf.Charts.ChartElementPanel,由于它不包含 Snapshots 属性,因此会引发错误。

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>

视图模型:

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

查看:

    public partial class MainWindow : Window
{
    private MainWindowViewModel _vm;


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

应用:

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

【问题讨论】:

    标签: c# wpf binding mvvm devexpress


    【解决方案1】:

    我想通了。由于StockSeries2D的DataContext不指向Window的DataContext

    &lt;dxc:StockSeries2D DataContext="DevExpress.Xpf.Charts.ChartElementPanel"

    我需要设置 DataSource 以使用 Window 的 DataContext

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      相关资源
      最近更新 更多