0

我在我的一些类之间传递一个对象时遇到了一个奇怪而令人沮丧的问题。这源于我是脚本编写者而不是程序员的事实,我只是在装模作样。所以我确定我在做一些愚蠢的事情:)

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

我做了以下事情:

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

当向导启动时,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,并且每个向导页面都能够访问(和操作)它。因此,任何指导将不胜感激!

4

1 回答 1

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

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

于 2013-08-19T23:06:49.740 回答