2013-01-18 117 views
1

我用此構造函數初始化該對象爲什麼observablecollection初始化爲null?

ObservableCollection<MyHomeworkModel> allTabs = new ObservableCollection<MyHomeworkModel>(); 

原來allTabs是初始化後空。因此,我無法將MyHomeworkModel對象添加到它。

請幫助我,並提前致謝。

using System.Windows.Input; 
using System.Collections.ObjectModel; 
using MyHomework; 

namespace MyHomework__MVVM_ 
{ 
    class MyHomeworkViewModel 
    { 
     private ObservableCollection<MyHomeworkModel> allTabs; 
     private MyHomeworkModel selectedTab; 

     public MyHomeworkViewModel() 
     { 
      ObservableCollection<MyHomeworkModel> allTabs = new ObservableCollection<MyHomeworkModel>(); 
      selectedTab = new MyHomeworkModel(); 
      AddCourseCommand = new AddCourseCommand(this); 
     } 

     public ObservableCollection<MyHomeworkModel> AllTabs 
     { 
      get 
      { 
       return allTabs; 
      } 
      set 
      { 
       allTabs = value; 
      } 
     } 

     public MyHomeworkModel SelectedTab 
     { 
      get 
      { 
       return selectedTab; 
      } 
      set 
      { 
       selectedTab = value; 
      } 
     } 

     public ICommand AddCourseCommand 
     { 
      get; 
      private set; 
     } 

     public void AddNewTab() 
     { 
      NewCourseName ncn = new NewCourseName(); 
      ncn.ShowDialog(); 
      if (ncn.courseName != null) 
      { 
       MyHomeworkModel newTab = new MyHomeworkModel(); 
       newTab.Header = ncn.courseName; 
       AllTabs.Add(newTab); 
      } 
     } 
    } 
} 
+0

你確定你看** ** **對象。答案是你的應用程序中有多個allTabs對象? – Tigran

+0

嘗試創建一個屬性到這個變量,並設置一個斷點到Setter中,而不是在設置爲Null後查看它的運行位置 – Venson

+0

我認爲你錯過了allTabs被更改的地方。在代碼_in isolation_之後,allTabs將**不**爲空。 –

回答

1
public MyHomeworkViewModel() 
    { 
     allTabs = new ObservableCollection<MyHomeworkModel>(); 
     selectedTab = new MyHomeworkModel(); 
     AddCourseCommand = new AddCourseCommand(this); 
    } 
+0

多麼愚蠢的錯誤!我不能相信XD謝謝! – user1447343

1

如果創建

ObservableCollection<MyHomeworkModel> allTabs = new ObservableCollection<MyHomeworkModel>(); 

在構造函數,這將耗盡之後被去除。外聲明它並調用只是

allTabs = new ObservableCollection<MyHomeworkModel>(); 
+0

他在構造函數之外聲明它,他只是在構造函數中將它映射到本地。 – Servy

+0

是的,但他永遠不會創建一個Membervariable的實例,那就是重點! – Venson

+0

你聲明他應該在構造函數之外聲明它,但他已經這樣做了,這就是我的觀點。他需要初始化他已經聲明的字段,並且您的前3次編輯沒有說明這一點。 – Servy

0

ObservableCollection<MyHomeworkModel> allTabs = new ObservableCollection<MyHomeworkModel>();allTabs設置爲一個新的集合,它創建一個新的局部變量和局部變量設置爲一個新的集合。要初始化場,你應該改變該行:

allTabs = new ObservableCollection<MyHomeworkModel>(); 
+1

我建議使用'this.allTabs',這樣就清楚了變量的範圍。 –

+0

@AshBurlaczenko嗯,在這裏他不應該有任何*當地人,因爲不需要任何東西,所以不應該有任何東西與之混淆。將「this.'用於所有字段訪問的想法是有些喜歡的,有些不喜歡的。 – Servy

3

這裏(在MyHomeworkViewModel構造函數):

ObservableCollection<MyHomeworkModel> allTabs = new ObservableCollection<MyHomeworkModel>(); 

您創建陰影類成員一個局部變量,因此它在構造函數調用後保持爲空。爲了避免這種情況只是在聲明的開頭跳過類型:

allTabs = new ObservableCollection<MyHomeworkModel>(); 
+0

這應該是被接受的答案,因爲這樣做的結果 – DerpyNerd

0

這是一個原因前綴私有類變量以下劃線的C#約定:

private ObservableCollection<MyHomeworkModel> _allTabs;

這裏更多指引: http://msdn.microsoft.com/en-gb/library/vstudio/ms229042%28v=vs.100%29.aspx

+0

1)如果他仍然在構造函數中使用這個類型,那麼這樣做不會阻止他將其隱藏起來2)它不像C中的慣例那樣常見於VB中。 VB使用它更多,因爲它不能依賴區分大小寫。 3)你的鏈接不鼓勵這種做法。 – Servy