Ste*_*hen 5 c# wpf binding devexpress mvvm
我正在尝试将ViewModel中的ObservableCollection数据绑定到View中的Devexpress 2D Stock Chart.我知道VM绑定了View的DataContext,因为我将窗口的Title绑定到VM中的属性,并且在运行程序时它是正确的.该集合被正确实例化,我可以看到所有对象都已创建,具有值,并被添加到集合中.
图表信息没有显示.该图表显示的不是应该绑定到它的信息.我猜它与我的XAML中的一行有关,但我只是不知道它是什么.
这是输出中的错误:
System.Windows.Data错误:40:BindingExpression路径错误:'对象'''ChartElementPanel'(Name ='')'上找不到'快照'属性.BindingExpression:路径= DataContext.Snapshots; DataItem ='ChartElementPanel'(Name =''); target元素是'StockSeries2D'(HashCode = 24500892); target属性是'DataSource'(类型'Object')
DevExpress版本是10.1.9
编辑:我想我知道问题出在哪里.StockSeries2D DataContext = DevExpress.Xpf.Charts.ChartElementPanel所以当我使用
DataSource="{Binding Path=DataContext.Snapshots}"
Run Code Online (Sandbox Code Playgroud)
它确实指向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>
Run Code Online (Sandbox Code Playgroud)
视图模型:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
视图:
public partial class MainWindow : Window
{
private MainWindowViewModel _vm;
public MainWindow(MainWindowViewModel vm)
{
InitializeComponent();
_vm = vm;
this.DataContext = _vm;
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我想到了.由于StockSeries2D的DataContext未指向Window的DataContext
<dxc:StockSeries2D DataContext="DevExpress.Xpf.Charts.ChartElementPanel"
我需要设置DataSource以使用Window的DataContext
<dxc:StockSeries2D DataSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Snapshots}"
归档时间: |
|
查看次数: |
4111 次 |
最近记录: |