Как сохранить выбор в ListBox при перезагрузке ItemsSource - PullRequest
3 голосов
/ 26 сентября 2011

Я экспериментирую с WPF и MVVM в нашей системе.Однако у меня возникла проблема с сохранением объектов, выбранных в списках, используя только MVVM (без использования дополнительных CollectionViews).В настоящее время у меня есть список

ObservableCollection<ReservationCustomerList> Customers;

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

Есть ли у кого-нибудь хороший способ добиться этого?

Ответы [ 4 ]

3 голосов
/ 26 сентября 2011

То, как мы это сделали, состояло в том, что мы не заменили коллекцию.Мы добавили / удалили записи и обновили существующие записи, если это необходимо.При этом сохраняется выбор.

Вы можете использовать методы LINQ, такие как Except, для идентификации новых или удаленных элементов.

1 голос
/ 26 сентября 2011

Если перезагруженный список все еще содержит последний выбранный элемент и вы хотите, чтобы этот элемент был выбран, вы можете вызвать событие PropertyChange для свойства SelectedCustomer после перезагрузки вашей коллекции. Убедитесь, что ваш класс viewmodel реализует интерфейс INotifyPropertyChanged.

0 голосов
/ 26 сентября 2011

Когда вы «перезагружаете» свою коллекцию, вы в основном заменяете все значения в ней новыми значениями.Даже те, которые выглядят и чувствуют себя идентичными, на самом деле являются новинками.Итак, как вы хотите сослаться на тот же элемент в списке, когда он исчез?Конечно, вы могли бы использовать хак, где вы определяете элемент, который был выбран по его свойствам, и повторно выбираете его (т. Е. Выполняете LINQ-поиск по списку и возвращаете идентификатор соответствующего элемента, а затем повторно выбираете его).Но это определенно не будет использовать лучшие практики.

Вам действительно нужно только обновить вашу коллекцию, то есть удалить недействительные записи и добавить новые записи.Если у вас есть представление, подключенное к вашей коллекции, вся сортировка и выбор и все остальное будет автоматически выполнено за кадром.

Редактировать:

        var tmp = this.listBox1.SelectedValue;
        this._customers.Clear();

        this._customers.Add(item1); this._customers.Add(item2);
        this._customers.Add(item3); this._customers.Add(item4);
        this.listBox1.SelectedValue = tmp;

в методе, который выполняет сброс /Ясно работает для меня.Т.е. это код, который я вставил в метод обработки событий, вызываемый при нажатии кнопки обновления в моем примере приложения.Таким образом, вам даже не нужно хранить ссылки на объекты клиентов, если вы уверены, что ваш ID является непротиворечивым.Другие вещи, которые я пробовал, такие как перезапись метода коллекций «ClearItems ()» и перезапись «Equals ()» и «GetHashCode ()», не работали - как я и ожидал.

0 голосов
/ 26 сентября 2011

вы можете использовать ICollectionView для выбора нужной сущности.

ICollectionview view = (ICollectionView)CollectionViewSource.GetDefaultView(this.Customers);

view.MoveCurrentTo(SelectedCustomer);

в вашем Xaml itemsControl должен иметь IsSynchronizedWithCurrentItem = true

или, если ItemsControl имеет свойство SelectedItem, вы можетепросто привяжите его к свойству SelectedCustomer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...