2010-03-11 3 views
10

У нас есть ListBox, который имеет несколько элементов. Элементы вставляются в ListBox через ObservableCollection. Некоторые из этих элементов можно редактировать прямо в ListBox. Однако, если элемент добавляется по индексу < к индексу отредактированного элемента, весь контент ListBox перемещается вниз.Замораживание listboxitem при добавлении элементов

Что нам нужно сделать, так это следующее: если элемент находится в режиме редактирования, мы хотели бы заморозить его положение на экране. Это нормально, если элементы добавляются в коллекцию, а пользовательский интерфейс вокруг элемента изменяется. Но позиция элемента должна оставаться постоянной на экране.

Единственное, что я смог сделать до сих пор, это присоединить к событию ScrollChanged и, самое большее, использовать методы BringIntoView или ScrollIntoView, чтобы гарантировать, что элемент всегда отображается где-то в пользовательском интерфейсе, но я не могу чтобы заблокировать его положение.

Кто-нибудь сделал что-то подобное и помог?

+0

Я не хотел представлять это как ответ, но первое, что я попробовал бы, если бы мне пришлось это сделать (и если вы используете привязку данных), - это разбить привязку данных, когда элемент редактируется, и набор datacontext снова после завершения редактирования. – Dave

ответ

0

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


ScrollViewer sv = listBox.GetScrollViewer(); 
double indexPos = sv.HorizontalOffset; 

Однако, я думаю, вам было бы лучше подключиться к событию ObservableCollection.CollectionChanged. Когда событие срабатывает, проверьте, было ли новое значение вставлено над вашим «режимом редактирования». Если это так, выполните следующий код.


ScrollViewer sv = listBox.GetScrollViewer(); 
sv.ScrollToHorizontalOffset(indexPos+1); // This will obviously require an offset 
+0

Очень интересно. Я попробую это завтра и отчитаюсь о том, как это работает. Благодарю. –

0

Проблема в том, что вы просто не хотите, чтобы она двигалась? Или проблема в том, что вы указали указанный элемент по его номеру индекса, а изменение индекса вызывает другие проблемы при применении изменений (например, применение их к элементу, который теперь находится в предыдущем индексе)?

Если проблема в том, что изменение индекса вызывает проблемы с кодом, я бы прекратил использовать индекс и вместо этого получал ссылку на объект. Позже вы всегда можете получить индекс элемента, если найдете, что вам это нужно.

1

Я думаю, что следующий будет решить вашу проблему:

  1. При входе в режим редактирования, сохранить ссылку на объект, вы редактируете, его индекс в ListBox и HorizontalOffset в ScrollViewer в.

  2. В обработчике события ObservableCollection.CollectionChanged найдите новый индекс объекта, который вы редактируете, если индекс изменился, замените отредактированный элемент тем, который теперь занимает его место (или какая-то другая логика, если вы хотите сохранить определенный порядок). Затем, если ScrollViewer.HorizontalOffset изменился, переместите его обратно на указанное смещение.

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

Надеюсь, это поможет вам.

0

Можно ли переключиться на ListView и использовать EnsureVisible?

0

Если замораживание остальной части списка является жизнеспособным вариантом.Так что добавляемые элементы не появляются до тех пор, пока редактирование не будет завершено или не экранировано, вы можете попробовать использовать BeginUpdate и EndUpdate, чтобы не перекрашивать ListBox. Я не уверен, как это повлияет на процесс редактирования.

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