Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обновляется ListView ? 
:(
    Опции темы
Stas123
Дата 16.11.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



У меня в ObservableCollection хранятся объекты. 
Довольно часто свойства этих объектов изменяются, но не происходит обновления изображения в ListView.
Как сделать так, чтобы при изменении свойств объектов происходила перерисовка их отображения в ListView ?
Или может быть лучше использовать другой элемент для отображения?
PM MAIL   Вверх
Stas123
Дата 18.11.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



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>

Скажите, что вызвает перерисовку списка и как это перерисовку можно вызвать вручную?
PM MAIL   Вверх
Gvozdin
Дата 18.11.2011, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Объекты должны реализовывать INotifyPropertyChanged
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
Stas123
Дата 22.11.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



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

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


PM MAIL   Вверх
RastaDja
Дата 22.11.2011, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Код

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


Это сообщение отредактировал(а) RastaDja - 22.11.2011, 11:45


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Stas123
Дата 22.11.2011, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
RastaDja
Дата 22.11.2011, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



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

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


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Stas123
Дата 22.11.2011, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



Может быть на это событие PropertyChanged нужно где-то подписаться?
PM MAIL   Вверх
Gvozdin
Дата 22.11.2011, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Цитата(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.

Если хотите более детальных ответов, то сделайте демо проект с вашей проблемой.
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
Stas123
Дата 22.11.2011, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



Цитата

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

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

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

Цитата

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

Да.

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

Это сообщение отредактировал(а) Stas123 - 22.11.2011, 12:17
PM MAIL   Вверх
Stas123
Дата 22.11.2011, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



разобрался, всем спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.