C# 使用绑定时动态数据显示线图未正确更新
这个问题已经解决了。我已经在下面的代码中添加了修复,注释掉的部分来自旧代码 原始问题: 我试图使用动态数据显示线条图,但在更新时遇到问题(D3链接:) 代码编译并运行,将在构造函数中显示该行,但当我启动其中一条显示消息时,图形不会更新。我已确认显示消息已到达,并且值列表已更新,如果单击图形或使用缩放功能,则数据将在屏幕上更新 XXX\u Display1\u VM.cs:C# 使用绑定时动态数据显示线图未正确更新,c#,wpf,visual-studio-2010,data-binding,dynamic-data-display,C#,Wpf,Visual Studio 2010,Data Binding,Dynamic Data Display,这个问题已经解决了。我已经在下面的代码中添加了修复,注释掉的部分来自旧代码 原始问题: 我试图使用动态数据显示线条图,但在更新时遇到问题(D3链接:) 代码编译并运行,将在构造函数中显示该行,但当我启动其中一条显示消息时,图形不会更新。我已确认显示消息已到达,并且值列表已更新,如果单击图形或使用缩放功能,则数据将在屏幕上更新 XXX\u Display1\u VM.cs: using System; using System.Collections.Generic; using System.L
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using XXX.BaseTypes;
using XXX.BaseClasses.BaseViewModels;
using XXX.InterfaceLibrary.Interfaces.Mediator;
using XXX.InterfaceLibrary.Interfaces.SystemController;
using System.Web;
using System.ComponentModel;
using Microsoft.Research.DynamicDataDisplay.DataSources;
namespace SystemController
{
public class ModelData
{
public double XValue { get; set; }
public double YValue { get; set; }
public ModelData(double x, double y)
{
XValue = x;
YValue = y;
}
}
class XXX_Display1_VM : ViewModelBase, INotifyPropertyChanged, IXXX_Display1_VM
{
IXXX_Driver _Driver;
IMediator _Messenger;
public ObservableCollection<ModelData> Values { get; private set; }
CompositeDataSource _Display1;
public CompositeDataSource Display1
{
get
{
//Removed this and moved it to the areas where the values are being set
//if (_Display1 == null)
//{
//var xData = new EnumerableDataSource<double>(Values.Select(v => v.YValue));
//xData.SetXMapping(x => x);
//var yData = new EnumerableDataSource<double>(Values.Select(v => v.XValue));
//yData.SetYMapping(y => y);
//_Display1 = xData.Join(yData);
//}
return _Display1;
}
}
public event PropertyChangedEventHandler PropertyChanged;
//protected void RaisePropertyChanged(string propertyName)
//{
// if (PropertyChanged != null)
// {
// PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
// }
//}
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, e);
}
}
protected void OnPropertyChanged(string propertyName)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
public XXX_Display1_VM(IXXX_Driver InDriver, IMediator InMessenger)
{
_Driver = InDriver;
_Messenger = InMessenger;
_Messenger.Register<DisplayMsgData>(ShellMessage.DISPLAY_MESSAGE_EVENT, OnReceiveDisplayMessage);
Values = new ObservableCollection<ModelData>();
_Display1 = new CompositeDataSource();
Values.Add(new ModelData(1.0,1.0));
Values.Add(new ModelData(1.5, 2.0));
Values.Add(new ModelData(2.0, 2.5));
var xData = new EnumerableDataSource<double>(Values.Select(v => v.YValue));
xData.SetXMapping(x => x);
var yData = new EnumerableDataSource<double>(Values.Select(v => v.XValue));
yData.SetYMapping(y => y);
_Display1 = xData.Join(yData);
}
private void OnReceiveDisplayMessage(DisplayMsgData Data)
{
if (Data.MsgType == "SetMode1")
{
Values.Clear();
Values.Add(new ModelData(2.0, 1.0));
Values.Add(new ModelData(1.5, 2.0));
Values.Add(new ModelData(2.0, 2.5));
var xData = new EnumerableDataSource<double>(Values.Select(v => v.YValue));
xData.SetXMapping(x => x);
var yData = new EnumerableDataSource<double>(Values.Select(v => v.XValue));
yData.SetYMapping(y => y);
_Display1 = xData.Join(yData);
OnPropertyChanged("Display1");
}
else if (Data.MsgType == "SetMode2")
{
Values.Clear();
Values.Add(new ModelData(3.0, 1.0));
Values.Add(new ModelData(2.5, 2.0));
Values.Add(new ModelData(5.0, 2.5));
var xData = new EnumerableDataSource<double>(Values.Select(v => v.YValue));
xData.SetXMapping(x => x);
var yData = new EnumerableDataSource<double>(Values.Select(v => v.XValue));
yData.SetYMapping(y => y);
_Display1 = xData.Join(yData);
OnPropertyChanged("Display1");
}
else if (Data.MsgType == "SetMode3")
{
Values.Clear();
Values.Add(new ModelData(1.0, 3.0));
Values.Add(new ModelData(2.5, 2.0));
Values.Add(new ModelData(3.0, 1.5));
var xData = new EnumerableDataSource<double>(Values.Select(v => v.YValue));
xData.SetXMapping(x => x);
var yData = new EnumerableDataSource<double>(Values.Select(v => v.XValue));
yData.SetYMapping(y => y);
_Display1 = xData.Join(yData);
OnPropertyChanged("Display1");
}
}
public string GetClassName()
{
return "XXX_DisplayController_VM";
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Collections.ObjectModel;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
使用XXX.BaseTypes;
使用XXX.BaseClasses.BaseViewModels;
使用XXX.InterfaceLibrary.Interfaces.Mediator;
使用XXX.InterfaceLibrary.Interfaces.SystemController;
使用System.Web;
使用系统组件模型;
使用Microsoft.Research.DynamicDataDisplay.DataSources;
命名空间系统控制器
{
公共类模型数据
{
公共双XValue{get;set;}
公共双Y值{get;set;}
公共模型数据(双x,双y)
{
XValue=x;
y值=y;
}
}
类XXX_Display1_VM:ViewModelBase、INotifyPropertyChanged、IXXX_Display1_VM
{
IXXX_驱动程序_驱动程序;
IMediator信使;
公共可观测集合值{get;private set;}
复合数据源_Display1;
公共复合数据源显示1
{
得到
{
//删除此项并将其移动到设置值的区域
//如果(_Display1==null)
//{
//var xData=新的EnumerableDataSource(Values.Select(v=>v.YValue));
//xData.SetXMapping(x=>x);
//var yData=新的EnumerableDataSource(Values.Select(v=>v.XValue));
//设置映射(y=>y);
//_Display1=xData.Join(yData);
//}
返回显示1;
}
}
公共事件属性更改事件处理程序属性更改;
//受保护的void RaisePropertyChanged(字符串propertyName)
//{
//if(PropertyChanged!=null)
// {
//PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
// }
//}
PropertyChanged上的受保护无效(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理者(本,e);
}
}
受保护的无效OnPropertyChanged(字符串propertyName)
{
OnPropertyChanged(新PropertyChangedEventArgs(propertyName));
}
公共XXX_显示器1_虚拟机(IXXX_驱动程序InDriver、iMedia或InMessenger)
{
_司机=INDRIVE;
_信使=信使;
_Messenger.Register(ShellMessage.DISPLAY\u MESSAGE\u事件,OnReceiveDisplayMessage);
值=新的ObservableCollection();
_Display1=新的CompositeDataSource();
添加(新模型数据(1.0,1.0));
添加(新模型数据(1.5,2.0));
添加(新模型数据(2.0,2.5));
var xData=新的EnumerableDataSource(Values.Select(v=>v.YValue));
xData.SetXMapping(x=>x);
var yData=新的EnumerableDataSource(Values.Select(v=>v.XValue));
设置映射(y=>y);
_Display1=xData.Join(yData);
}
私有void OnReceiveDisplayMessage(DisplayMsgData数据)
{
如果(Data.MsgType==“SetMode1”)
{
value.Clear();
添加(新模型数据(2.0,1.0));
添加(新模型数据(1.5,2.0));
添加(新模型数据(2.0,2.5));
var xData=新的EnumerableDataSource(Values.Select(v=>v.YValue));
xData.SetXMapping(x=>x);
var yData=新的EnumerableDataSource(Values.Select(v=>v.XValue));
设置映射(y=>y);
_Display1=xData.Join(yData);
OnPropertyChanged(“Display1”);
}
else if(Data.MsgType==“SetMode2”)
{
value.Clear();
添加(新模型数据(3.0,1.0));
添加(新模型数据(2.5,2.0));
添加(新模型数据(5.0,2.5));
var xData=新的EnumerableDataSource(Values.Select(v=>v.YValue));
xData.SetXMapping(x=>x);
var yData=新的EnumerableDataSource(Values.Select(v=>v.XValue));
设置映射(y=>y);
_Display1=xData.Join(yData);
OnPropertyChanged(“Display1”);
}
else if(Data.MsgType==“SetMode3”)
{
value.Clear();
添加(新模型数据(1.0,3.0));
添加(新模型数据(2.5,2.0));
添加(新模型数据(3.0,1.5));
var xData=新的EnumerableDataSource(Values.Select(v=>v.YValue));
xData.SetXMapping(x=>x);
var yData=新的EnumerableDataSource(Values.Select(v=>v.XValue));
设置映射(y=>y);
_Display1=xData.Join(yData);
OnPropertyChanged(“Display1”);
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using XXX.InterfaceLibrary.Interfaces.SystemController;
namespace SystemController
{
/// <summary>
/// Interaction logic for XXX_Display1.xaml
/// </summary>
public partial class XXX_Display1 : UserControl, IXXX_Display1
{
IXXX_Display1_VM _VM;
IXXX_Driver _Driver;
public XXX_Display1(IXXX_Driver InDriver, IXXX_Display1_VM InVM)
{
_VM = InVM;
_Driver = InDriver;
DataContext = InVM; //new XXX_Display1_VM(_Driver);
InitializeComponent();
}
public string GetClassName()
{
return "XXX_Display1";
}
}
}
<UserControl x:Class="SystemController.XXX_Display1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"
mc:Ignorable="d"
d:DesignHeight="550" d:DesignWidth="550">
<Grid>
<d3:ChartPlotter Name="Display1" Height="400" Width="400">
<d3:Header>
<TextBlock HorizontalAlignment="Center" FontSize="20">Very simple line plot</TextBlock>
</d3:Header>
<d3:VerticalAxisTitle>This is vertical axis</d3:VerticalAxisTitle>
<d3:HorizontalAxisTitle>This is horizontal axis</d3:HorizontalAxisTitle>
<d3:LineGraph DataSource="{Binding Path=Display1}" Stroke="Black"/>
</d3:ChartPlotter>
</Grid>
</UserControl>
EnumerableDataSource<Point> m_d3DataSource;
public EnumerableDataSource<Point> D3DataSource {
get {
return m_d3DataSource;
}
set {
//you can set your mapping inside the set block as well
m_d3DataSource = value;
OnPropertyChanged("D3DataSource");
}
}
protected void OnPropertyChanged(PropertyChangedEventArgs e) {
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) {
handler(this, e);
}
}
protected void OnPropertyChanged(string propertyName) {
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}