2015-12-03 66 views
1

我有ObservableCollection女巫可以容纳两种不同类型FirstDerivedTypeSecondDerivedType。他们两人都持有Data的参考资料。而主要的问题是,为什么当我在构造函数创建PlotModel的实例FirstDerivedType()基本函数的奇怪行为

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; } 
} 
} 
+0

什么的DataContext? – nvoigt

+0

此代码是WPF应用程序的一部分。 DataContext是我需要为绑定放置数据的属性。 – A191919

回答

2

在一个没有工作的情况下更多的信息,你不设置该属性Data类型的实例的PlotModel,你只是方法参数PlotModel的值设置为的PlotModel一个新的实例。请注意,Data.PlotModel仍为空。

此行这里:

public virtual void Draw(PlotModel PlotModel) 
{ 
    PlotModel = new OxyPlot.PlotModel(); //do not Working 

一个新的实例分配给参数的方法DrawPlotModel实例Data的财产PlotModel。它不会影响包含属性PlotModel的实例Data。这条线:

base.Draw(Data.PlotModel); 

不会导致如果方法参数在Draw方法重新分配更改属性Data.PlotModel

尝试重命名DrawCreatePlotModel然后这样做:

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