Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Как обновляется ListView ?


Автор: Stas123 16.11.2011, 10:39
У меня в ObservableCollection хранятся объекты. 
Довольно часто свойства этих объектов изменяются, но не происходит обновления изображения в ListView.
Как сделать так, чтобы при изменении свойств объектов происходила перерисовка их отображения в ListView ?
Или может быть лучше использовать другой элемент для отображения?

Автор: Stas123 18.11.2011, 15:50
ObservableCollection  присоединина к ListView таким образом
Код

<ListView x: ItemsSource="{Binding ElementName=securitiesWindow, Path=House}" >
                    <ListView.View>
                        <GridView >
                            <GridViewColumn Width="60" Header="Room" DisplayMemberBinding="{Binding Path=Room.Name}" />
                                                    </GridView>
                    </ListView.View>
                </ListView>

Скажите, что вызвает перерисовку списка и как это перерисовку можно вызвать вручную?

Автор: Gvozdin 18.11.2011, 22:45
Объекты должны реализовывать INotifyPropertyChanged

Автор: Stas123 22.11.2011, 11:31
Gvozdin,  добавил реализацию INotifyPropertyChanged в класс, но это не помогло.
Событие об изменении коллекции происходит только при добавлении/удалении элементов.
Такой код молчит при изменении свойств объекта.
Код

this.MyCollection.CollectionChanged += delegate { this.GuiAsync(() => MessageBox.Show("") ); };


Автор: RastaDja 22.11.2011, 11:43
Код

public class mClass: INotifyPropertyChanged
{
   //...
   public event PropertyChangedEventHandler PropertyChanged;                //  <----------
   private void OnPropertyChanged(String info)
   {
      if (PropertyChanged != null)
      {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
      }
   }

   public String Name {
      set 
      {
         m_Name = value;
         OnPropertyChanged("Name");     //  сообщаем об изменении свойства Name (INotifyPropertyChanged)
      }
   }
}

Автор: Stas123 22.11.2011, 11:53
RastaDja,  Да, у меня почти так и сделано.
Код

private void OnChange(string name)
        {
            this.Name = name;
            NotifyPropertyChanged("Name");
        }
        
private void NotifyPropertyChanged(string info)
        {
            if(PropertyChanged != null){
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
        
        
public event PropertyChangedEventHandler PropertyChanged;
public string Name { get; private set; }

Автор: RastaDja 22.11.2011, 12:00
Цитата(Stas123 @  22.11.2011,  12:53 Найти цитируемый пост)
Да, у меня почти так и сделано.

А твои свойства изменяются с наружи, или внутри класса тоже? Если внутри тоже, тогда вставь NotifyPropertyChanged("Name") везде, где есть изменение.

Автор: Stas123 22.11.2011, 12:02
Может быть на это событие PropertyChanged нужно где-то подписаться?

Автор: Gvozdin 22.11.2011, 12:02
Цитата(Stas123 @ 22.11.2011,  11:31)
Gvozdin,  добавил реализацию INotifyPropertyChanged в класс, но это не помогло.
Событие об изменении коллекции происходит только при добавлении/удалении элементов.
Такой код молчит при изменении свойств объекта.
Код

this.MyCollection.CollectionChanged += delegate { this.GuiAsync(() => MessageBox.Show("") ); };

Ну конечно CollectionChanged молчит, оно реагирует только на изменения самой коллекции.

Объект из свойства Room элемента вашей коллекции точно поддерживает INotifyPropertyChanged?

Попробуйте с текст боксом:

<TextBox Text="{Binding Path=Name}" DataContext="{Binding ElementName=securitiesWindow, Path=House[0]}"/>

И реализацию лучше сделайте как показал RastaDja.

Если хотите более детальных ответов, то сделайте демо проект с вашей проблемой.

Автор: Stas123 22.11.2011, 12:17
Цитата

Цитата(Stas123 @  22.11.2011,  12:53 )
Да, у меня почти так и сделано.

А твои свойства изменяются с наружи, или внутри класса тоже? Если внутри тоже, тогда вставь NotifyPropertyChanged("Name") везде, где есть изменение

Своиство изменяется изнутри и только при наступлении события, private void OnChange(string name) - это обработчик события.

Цитата

Объект из свойства Room элемента вашей коллекции точно поддерживает INotifyPropertyChanged?

Да.

Сейчас отправлю демо.

Автор: Stas123 22.11.2011, 14:49
разобрался, всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)