2013-08-19 283 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