我有 ObservableCollection 女巫可以容纳两种不同的类型 FirstDerivedType
和 SecondDerivedType
。他们都持有对 Data
的引用。主要问题是为什么当我在构造函数 FirstDerivedType()
PlotModel
的实例时
Data.PlotModel = new PlotModel();
效果很好。但是当我在 base.Draw(Data.PlotModel);
中创建 PlotModel
的实例时,我在 DataContext
中得到了 null
>。为什么?
namespace WpfApplication3
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new CurrentViewModel();
}
}
public class CurrentViewModel
{
private ObservableCollection<BaseType> items;
public ObservableCollection<BaseType> Items
{
get
{
return this.items;
}
set
{
this.items = value;
}
}
public CurrentViewModel()
{
Items = new ObservableCollection<BaseType>();
Items.Add(new FirstDerivedType (17));
Items.Add(new FirstDerivedType (100));
Items.Add(new FirstDerivedType (50));
Items.Add(new FirstDerivedType (120));
}
}
public class Data:INotifyPropertyChanged
{
public int ID { get; set; }
public PlotModel PlotModel { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string info)
{
if (PropertyChanged!=null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
public abstract class BaseType
{
public virtual void Draw(PlotModel PlotModel)
{
PlotModel = new OxyPlot.PlotModel(); //do not Working
LineSeries LS= new LineSeries();
Random rnd = new Random();
for (int i=0; i<10; i++)
{
LS.Points.Add(new DataPoint(i,rnd.Next(1,100)));
}
PlotModel.Series.Add(LS);
PlotModel.InvalidatePlot(false);
}
}
public class FirstDerivedType : BaseType
{
public FirstDerivedType(int ID)
{
Data = new Data();
//Data.PlotModel = new PlotModel(); //Working
Data.ID = ID;
base.Draw(Data.PlotModel);
}
public Data Data { get; set; }
}
public class SecondDerivedType : BaseType
{
public Data Data { get; set; }
}
}
最佳答案
在不起作用的情况下,您没有设置 Data
类型实例的属性 PlotModel
,您只是设置方法参数的值 PlotModel
到 PlotModel
的新实例。请注意,Data.PlotModel
仍为空。
这里是这一行:
public virtual void Draw(PlotModel PlotModel)
{
PlotModel = new OxyPlot.PlotModel(); //do not Working
将新实例分配给方法 Draw
的参数 PlotModel
,NOT 的属性 PlotModel
实例数据
。它不会影响包含属性 PlotModel
的实例 Data
。这一行:
base.Draw(Data.PlotModel);
如果在 Draw
方法中重新分配方法参数,则不会导致属性 Data.PlotModel
发生变化。
尝试将 Draw
重命名为 CreatePlotModel
然后这样做:
public virtual PlotModel CreatePlotModel()
{
var model = new OxyPlot.PlotModel();
LineSeries LS= new LineSeries();
Random rnd = new Random();
for (int i=0; i<10; i++)
{
LS.Points.Add(new DataPoint(i,rnd.Next(1,100)));
}
model.Series.Add(LS);
model.InvalidatePlot(false);
return model;
}
然后分配数据的 PlotModel
属性:Data.PlotModel = base.CreatePlotModel()
关于c# - 基函数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34060921/