【问题标题】:Why is ObservableCollection<string> property returning null?为什么 ObservableCollection<string> 属性返回 null?
【发布时间】:2015-02-20 14:27:41
【问题描述】:

我有些困惑,为什么我不能将课程之外的项目添加到公共 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;

可以向我解释一下为什么上面的例子总是在ObservableCollection&lt;String&gt;hosts中返回null

但如果我执行以下操作,使用 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 和类的新手。

【问题讨论】:

  • 你的第二个例子甚至没有编译。
  • 认为这是由于试图返回 res 而不是 vm
  • “有人可以向我解释为什么这不起作用”什么不起作用?你得到什么错误(如果有的话)?第二个以什么方式“工作”?因为您显然可以 .Add 到一个数组,即使它不是私有的。
  • hosts 为空,因为您从未为它赋值。但是您说您尝试过的这种替代public ObservableCollection&lt;String&gt; hosts = new ObservableCollection&lt;String&gt;(); 应该可以工作,因为您现在已经为hosts 分配了一个值。此外,可能值得查看 C# 样式指南并遵循那里的约定。它使其他人更容易查看您的代码。

标签: c#


【解决方案1】:

当您在类中声明成员时,它将以该类型的默认值开始。其中,如果它是一个引用类型,哪些集合是,它将是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# 中,公共成员是帕斯卡大小写的。例如:https://msdn.microsoft.com/en-us/library/x2dbyw72%28v=vs.71%29.aspx

这似乎无关紧要,但是遵循样式指南确实可以让其他查看您的代码的人更容易更快地掌握您在做什么,如果您正在向其他程序员寻求帮助,这很好。

【讨论】:

  • 我同意风格指南的建议。我花了一分钟的时间来了解当前形式的代码。
猜你喜欢
  • 2015-05-30
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2022-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多