将数据传递给构造函数
本文关键字:构造函数 数据 | 更新日期: 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());
}
}
编辑:修复了复制粘贴错误。。。