Обновить данные в ListBox - перестать двигать полосу прокрутки и мигать выбранный элемент - PullRequest
0 голосов
/ 06 февраля 2011

Я пытаюсь решить эту проблему. В приложении WFP я связываю коллекцию двоичных объектов со свойством ItemSource listBox.

подпись объекта недвижимости:

    public BindableCollection<UserInfo> Friends
    {
        get { return _friends; }
        set
        {
            _friends = value;
            NotifyOfPropertyChange(() => Friends);
        }
    }

Свойство consit класса UserInfo:

  • BitmapImage ProfilePhoto {get; set;}
  • String Nick {get; set}
  • Статус строки {get; set;} // в автономном режиме, в сети, в чате
  • String ChatRoom {get; set;} // имя комнаты чата, в которой пользователь общается

Я получаю каждые 10 секунд новые свежие данные как IDictionary => ().

Мне нужно обновить данные в списке. Поэтому я пытаюсь это:

    private void RefreshContactsData(IEnumerable<KeyValuePair<string, UserInfo>> freshFriends)
    {
        //store selected item in listBox
        var tempSelectedFriend = SelectedFriend;

        //store selecte index in listbox
        var tempSelectedIndex = SelectedFriendsIndex;

        //Clear property which is binded on listBox ItemSource
        Friends.Clear();


        foreach (var freshFriend in freshFriends)
        {
            freshFriend.Value.IsFriend = true;

            //Add fresh data
            Friends.Add(freshFriend.Value);
        }

        StayInRoom();

        //set
        SelectedFriend = tempSelectedFriend;
        SelectedFriendsIndex = tempSelectedIndex;

    }

Проблемы:

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

Как я могу удалить это нежелательное поведение.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2011

Чтобы не допустить скачка полосы прокрутки списка, не удаляйте, а затем добавьте обратно все элементы из BindableCollection.

Переписать ОбновитьКонтактыДанные на:

  1. Удалить элементы, которые существуют в Друзьях, которые больше не существуют в freshFriends.
  2. Добавить элементы, которые существуют в freshFriends, которых нет в Friends.
  3. Обновление существующих элементов в Friends и freshFriends.

Возможно, вам потребуется реализовать INotifyPropertyChanged в UserInfo.

0 голосов
/ 06 февраля 2011

Я ожидаю, что проблема в том, что ваше свойство SelectedFriend относится к ссылке, которой больше не существует при повторном заполнении вашей коллекции.Есть ли на UserInfo свойство, которое однозначно идентифицирует пользователя?(Nick?).Вместо этого вы можете сохранить это выбранное значение, а затем после повторного заполнения коллекции найти и установить SelectedFriend для элемента, чье значение Nick соответствует сохраненному значению.

...