将数据传递给构造函数

本文关键字:构造函数 数据 | 更新日期: 2023-09-27 18:28:19

我有一个奇怪的&在我的一些类之间传递对象的令人沮丧的问题。这源于我是一个脚本编写者而不是程序员,只是在摸索。所以我确信我在做一些愚蠢的事情:)

我正在尝试构建一个具有多个页面的向导对话框。我使用CodeProject的"国际化WPF向导"教程作为起点,并试图将其适应我的领域。我被卡住了,因为我的向导页面似乎无法引用模型。

我做了以下工作:

  • 为我的模型创建了一个类(让我们称之为MyData)
  • 为我的视图模型创建了基类(ViewModelBase)
  • 为我的每个页面创建了一个视图模型类,继承自ViewModelBase(下面的示例是WelcomePageViewModel)
  • 创建了一个"控制器"样式的视图模型,用于驱动向导。(WizardController)

启动向导时,将实例化WizardController。WizardController还实例化MyData。然后,WizardController实例化其余页面的每个视图模型。

实际的GUI似乎工作得很好,我可以看到每个页面的视图模型都被正确加载了。这里有一些代码:

public class MyData
{
    private string _someString;
    public MyData(string someString)
    {
        _someString = someString;
    }
}
public abstract class ViewModelBase : INotifyPropertyChanged
{
    bool _isCurrentPage;
    readonly MyData _myData;
    public ViewModelBase(MyData myData)
    {
        _myData = myData;
    }
}
public class WizardController : INotifyPropertyChanged
{
    MyData _myData;
    public WizardController()
    {
        _myData = new MyData("The Widgets");
    }
}

public class WelcomePageViewModel : ViewModelBase
{
    private MyData _myData;
    public WelcomePageViewModel(MyData myData)
        : base(myData)
    {
        _myData = myData;
        // accessing _myData fails :(
        MyLogger.WriteLine("Grabbed an instance of myData: " + _myData.ToString());
    }
}

但是,当我尝试从WelcomePageViewModel访问myData时,我的代码失败了。在WelcomePageViewModel的MyLogger行上,抛出错误"Object reference not set to a instance of a Object。"。

基本上,我所要实现的只是WizardController设置MyData,并且每个向导页面都可以访问(和操作)它。因此,任何指导都将不胜感激!

将数据传递给构造函数

正如Rob G在评论中建议的那样,您在继承的类中重新声明变量_myData。组织代码的正确方法是让_myData是仅在抽象基类上声明的受保护属性,并使用此属性从继承类访问变量。

public abstract class ViewModelBase : INotifyPropertyChanged
{
    bool _isCurrentPage;
    protected MyData MyData { get; private set; }
    public ViewModelBase(MyData myData)
    {
        MyData = myData;
    }
}
public class WelcomePageViewModel : ViewModelBase
{  
    public WelcomePageViewModel(MyData myData)
        : base(myData)
    {
       // Access the protected property
       MyLogger.WriteLine("Grabbed an instance of myData: " + MyData.ToString());
    }
}

编辑:修复了复制粘贴错误。。。