将数据传递给构造函数

时间:2013-08-19 22:37:36

标签: c# wpf mvvm

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

我正在尝试构建一个包含多个页面的向导对话框。我使用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行上,抛出错误“对象引用未设置为对象的实例。”。

基本上,我想要实现的是WizardController设置MyData,每个向导页面都能够访问(和操作)它。所以任何指导都将非常感谢!

1 个答案:

答案 0 :(得分:0)

正如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());
    }
}

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