c# - 基函数的奇怪行为

标签 c#

我有 ObservableCollection 女巫可以容纳两种不同的类型 FirstDerivedTypeSecondDerivedType。他们都持有对 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,您只是设置方法参数的值 PlotModelPlotModel 的新实例。请注意,Data.PlotModel 仍为空。

这里是这一行:

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

将新实例分配给方法 Draw 的参数 PlotModelNOT 的属性 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/

相关文章:

c# - Nancyfx 自托管无法停止 HttpListener

c# - Web 服务序列化复杂对象

c# - 我可以使用 C# 获取 Windows 的原始安装日期吗?

c# - 在 Entity Framework 中为大型列表使用 IList.Contains(item.Id) 的替代方案?

c# - C# 中的重载方法

c# - 如何从所有目录、其他目录中获取所有文件并检查每个文件大小?

c# - 无法为内容类型多部分配置 Web API

C# 限制线程 CPU 使用率

c# - 驱动 MVVM 应用程序

c# - 无法解码 .NET SslStream 握手中的完整密码列表