2013-08-19 224 views
0

我有一个奇怪的&令人沮丧的问题在我的一些类之间传递一个对象。这源于我是一名编剧,而不是一名程序员,而且我只是笨手笨脚的。所以我敢肯定,我正在做一些愚蠢的事:)将数据传递给构造函数

我想建立一个向导对话框有多个页面。我使用CodeProject的“国际化WPF向导”教程作为起点,并尝试将其适用于我的域。我陷入困境,因为我的向导页似乎无法引用模型。

我也做了以下内容:

  • 创造了我的模型类(姑且称之为迈德特)
  • 创建一个基类为我的视图模型(ViewModelBase)
  • 创建的视图模型类为我的每个页面,从ViewModelBase继承(例如下面的例子是WelcomePageViewModel)
  • 创建一个'控制器'风格的视图模型驱动向导。 (WizardController)

当向导启动时,WizardController被实例化。 WizardController也实例化MyData.Then,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

如果是访问代码'WelcomePageViewModel'对象? “WelcomePageViewModel”存储在哪里? –

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

编辑:固定复制 - 粘贴错误...

+0

谢谢哈瓦胡!这是现货! – Timothy