我对于为什么我无法将类外的项目添加到公共ObservableCollection
时感到困惑。
所以我想说我有一个课程如下:
public class TestClass
{
ObservableCollection<ViewModel> test;
public TestClass()
{
test = CreateDS();
}
protected ObservableCollection<ViewModel> CreateDataSource()
{
ObservableCollection<ViewModel> vm = new ObservableCollection<ViewModel>();
return vm;
}
public ObservableCollection<ViewModel> Data {get {return test; } }
public ObservableCollection<String> hosts {get; set;}
// also tried this way instead
public ObservableCollection<String> hosts = new ObservableCollection<String>();
}
通过执行以下操作,我已经初步确定了该课程:
TestClass tc = new TestClass();
tc.hosts.Add(Environment.MachineName);
DataContext = tc;
有些人可以向我解释为什么上面的例子总是在null
ObservableCollection<String>
hosts
但如果我使用string[]
hosts
执行以下操作,我至少可以获取值,而不是null
返回
public class TestClass
{
ObservableCollection<ViewModel> test;
string[] hosts = new string[]
{
"server1",
"server2"
};
public TestClass()
{
test = CreateDS();
}
protected ObservableCollection<ViewModel> CreateDS()
{
ObservableCollection<ViewModel> vm = new ObservableCollection<ViewModel>();
return vm;
}
public ObservableCollection<ViewModel> Data {get {return test; } }
}
我需要从课堂外的按钮事件中访问并填充hosts
ObservableCollection
。我是mvvm和类的新手。
答案 0 :(得分:2)
在类中声明成员时,它将以该类型的默认值开头。其中,如果是引用类型,哪些集合是,null
。所以当你这样做时:
public ObservableCollection<String> hosts {get; set;}
实例化对象时, hosts
将为null
。你可以这样做:
public ObservableCollection<String> hosts = new ObservableCollection<String>();
哪个应该有用(如果它不适合你,那么你还有其他东西在继续),或者你可以在构造函数中创建它:
public TestClass()
{
test = CreateDS();
hosts = new ObservableCollection<string>();
}
或者您可以在实例化对象时分配它:
TestClass tc = new TestClass();
tc.hosts = new ObservableCollection<string>();
tc.hosts.Add(Environment.MachineName);
哪种解决方案最适合您,取决于您打算如何使用该对象。
最后一个关于风格的说明。通常在C#中,公共成员都是pascal cased。例如,请参阅:https://msdn.microsoft.com/en-us/library/x2dbyw72%28v=vs.71%29.aspx
这看起来似乎是一个无关紧要的观点,但是如果您要求其他程序员寻求帮助,那么遵循样式指南确实可以让其他查看代码的人更容易掌握您正在做的事情,这很好。