我有一个奇怪的&令人沮丧的问题在我的一些类之间传递一个对象。这源于我是一个脚本编写者而不是程序员的事实,而且我只是笨手笨脚。所以我确定我做的事情是愚蠢的:)
我正在尝试构建一个包含多个页面的向导对话框。我使用CodeProject的“国际化WPF向导”教程作为起点,并尝试将其调整到我的域。我被卡住了,因为我的向导页面似乎无法引用模型。
我做了以下事情:
启动向导时,将实例化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,每个向导页面都能够访问(和操作)它。所以任何指导都将非常感谢!
答案 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());
}
}
编辑:修复了复制粘贴错误...