2013-01-18 211 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