2015-02-20 1 views
0

У меня есть путаница относительно того, почему я не могу добавлять предметы за пределами класса к общественному ObservableCollection.Почему ObservableCollection <string> свойство, возвращающее null?

Так позволяет сказать, что у меня есть класс следующим образом:

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; } } 
} 

Мне нужно, чтобы получить доступ и заполнить hostsObservableCollection из события кнопки вне класса. Я новичок в mvvm и классах.

+2

Ваш второй пример даже не компилируется. –

+0

И сначала тоже ... –

+0

думаю, что это было из-за попытки вернуть res, а не vm –

ответ

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# публичные члены имеют паскаль. См. Например: https://msdn.microsoft.com/en-us/library/x2dbyw72%28v=vs.71%29.aspx

Это может показаться неуместным, но руководство по стилю делает его намного проще для других людей, которые смотрят на ваш код, чтобы понять, что вы делаете быстрее, и это здорово, если вы просить других программистов о помощи.

+0

Я согласен с предложением руководства по стилю.Мне потребовалась дополнительная минута, чтобы проверить код в его текущей форме. –

Смежные вопросы