2012-07-01 3 views
0

У меня проблема с моим кодом. Я использую listbox и наблюдаемую коллекцию для добавления данных в список. код выглядит следующим образом:Почему мой ObservableCollection не обновляется в ListBox?

ListData actualData; 
ObservableCollection<ListData> data; 

public Calculate() 
{ 
    InitializeComponent(); 

    data = new ObservableCollection<ListData>(); 
    newData(); 

    listbox1.ItemsSource = data; 
} 

private void newData() 
{ 
    actualData = new ListData("1", "2", "3"); 
    data.Add(actualData); 
} 

Теперь у меня есть кнопка, которая, например, изменения actualData, но я не могу видеть изменения в списке.

кнопка выглядит следующим образом:

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    actualData.first = "12"; 
} 

Я нашел обходной путь:

listbox1.ItemsSource = null; 
listbox1.ItemsSource = data; 

, но это не является хорошим решением, что здесь не так?

ответ

3

Как правильно сказал ZafarYousafi в своем ответе, ObservableCollection<T> будет уведомлять только список добавленных и удаленных предметов; если вы измените свойство на одном из элементов, оно не будет обновляться в списке.

Вместо этого вам нужно изменить определение вашего ListData класса, например, так:

public class ListData : INotifyPropertyChanged 

Это требует вашего класса для реализации PropertyChanged события:

public event PropertyChangedEventHandler PropertyChanged; 

Теперь все, что вам нужно сделать, это изменить ваше определение first (соглашения о кодировании диктуют, что свойства должны начинаться с прописной буквы, PascalCase):

private string first; 
public string First 
{ 
    get { return first; } 
    set 
    { 
     first = value; 
     var handler = PropertyChanged; //according to Essential C# (M. Michaelis) 
     if (handler != null)   //the copy should prevent threading issues 
     {        
      handler(this, new PropertyChangedEventArgs("First")); 
     } 
    } 
} 

К слову: мне неловко приходится передавать имя свойства в виде строки. Для более сложного решения см. this tutorial.

+0

Пятно на! Единственное, что я сказал бы, это комментарии к вызову события. Это абсолютно лучшая практика, а не спорная тема. См. Этот ответ: http://stackoverflow.com/questions/2582052/c-sharp-event-handlers-not-thread-safe –

+0

okay; Я имел в виду [сообщение в блоге Эрика Липперта] (http://blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and-races.aspx) – Adam

+0

codesparkle: достаточно справедливо –

4

ObservableCollection будет уведомлять об этом только в том случае, если в списке есть активность, а не элемент списка. Активность в списке означает добавление/удаление элементов в списке. Вам необходимо реализовать интерфейс INotifyPropertyChange для класса ListData для уведомления об изменениях свойств/элементов класса ListData.

+0

Также работы INotifyPropertyChanged - я начинаю задаваться вопросом, в чем разница ... а, видимо, что-то об этом удаляется в .NET - http://bytes.com/topic/c-sharp/answers/270938-ipropertychange – Charleh

+0

Да, я имею в виду это, но пишу IPRopretyChange по ошибке. Нет такого интерфейса. IPropertyChange :) – ZafarYousafi

+0

Нет проблем, вы получите +1 от меня в любом случае: D – Charleh

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