2013-06-12 2 views
1

Я не могу понять это, потому что, похоже, я не могу отличить элементы ListView от типа ListViewItem и вызвать ListViewItem.Focus(). Ниже не будет работать, потому что элементы в ListView являются типа LogRecord:Как я могу заставить свой ListView сосредоточиться на определенном элементе?

((ListViewItem)listView.Items[0]).Focus(); 

EDIT: Я хочу, чтобы полоса прокрутки, чтобы переместить туда, где деталь, в основном, или лучше сказать, что элемент становится видимым в списке элементов, которые пользователь видит.

Любые идеи о том, как я могу заставить свой ListView сосредоточиться на определенном элементе? Прямо сейчас это связано с коллекцией. Вот как я создал мой ListView объект:

listView = new ListView(); 
Grid.SetRow(listView, 1); 
grid.Children.Add(listView); 
GridView myGridView = new GridView(); 
// Skipping some code here to set up the GridView columns and such. 
listView.View = myGridView; 
Binding myBinding = new Binding(); 
myBinding.Source = PaneDataContext.LogsWrapper; 
listView.SetBinding(ItemsControl.ItemsSourceProperty, myBinding); 

я связываться с этим типом данных (LogRecord содержит такие вещи, как LogRecord.Message, что соответствует колонке сообщений на виде сетки и т.д .; и код работает):

 public class LogRecordWrapper : IEnumerable<LogRecord>, INotifyCollectionChanged 
     { 
      public List<LogRecord> RowList { get; set; } 

      public event NotifyCollectionChangedEventHandler CollectionChanged; 

      public LogRecordWrapper() 
      { 
       RowList = new List<LogRecord>(); 
      } 

      protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
      { 
       if (CollectionChanged != null) 
       { 
        CollectionChanged(this, e); 
       } 
      } 

      public void SignalReset() 
      { 
       OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset, null)); 
      } 

      public void Add(LogRecord item) 
      { 
       RowList.Add(item); 
       OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item)); 
      } 

      public IEnumerator<LogRecord> GetEnumerator() 
      { 
       return RowList.GetEnumerator(); 
      } 

      System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
      { 
       return GetEnumerator(); 
      } 
     } 
+2

ListView.ScrollIntoView http://msdn.microsoft.com/en-us/library/system.windows.controls .listbox.scrollintoview.aspx – Paparazzi

+0

@Blam - Большое спасибо. Спас мою жизнь. Пожалуйста, опубликуйте это решение в качестве ответа, чтобы я мог его принять. – Alexandru

+0

@Blam - Что, если ScrollView в настоящее время не является частью сфокусированного элемента? Кажется, что эта операция фактически не выполняется, если только прокрутка не является частью сосредоточенного элемента. Есть ли способ обойти это? – Alexandru

ответ

1

ListView.ScrollIntoView

ListBox.ScrollIntoView Method

Ссылка говорит о ListBox, но она также работает с ListView также

Что касается no t, работая с Focus, сообщите, как вы используете ScrollIntoView.

+0

Я использую элементы управления RadPane от Telerik. Его инструмент для стыковки, как у вас есть стыковка и панели в Visual Studio. Я добавляю свой списокView в RadPane, и ScrollIntoView будет работать с RadPanes, которые видны, но он не будет работать на RadPanes, которые находятся на вкладке, как ни странно. – Alexandru

+0

Я точно знаю, что он вызывает метод с правильным элементом, но когда RadPane имеет вкладку и не отображается или закреплен и не отображается, он просто не будет прокручивать это в виде ... – Alexandru

+0

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

0

могли бы использовать:

listView.Items[0].Focused = true; 

... или, возможно:

listVIew.Items[0].Selected = true; 

(я не уверен, какой "фокус" вы после)

Затем в сочетании с (или использовать на месте):

listView.Items[0].EnsureVisible(); 
+0

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

+0

Но ... listView.Items [0] не имеет Focused или Selected или EnsureVisible, потому что они не имеют тип ListViewItem из-за привязки данных к моей коллекции LogRecord's. – Alexandru

+0

Моя первоначальная проблема - это случай привязки данных к коллекции, которая не относится к типу ListViewItem, поэтому теперь как я могу убедиться, что элемент видим? – Alexandru

0

Это потрясающе !!!! 29-29-2002, 16:53 PM # 1 Jim Гость ListView EnsureVisible не работает. Есть идеи? Код ... на самом деле найти и выделить выделенный элемент, это просто не прокрутка и сделать его видимым. Пользователь вынужден перейти к элементу.

04-04-2004, 12:07 утра luchmun Привет, работает в форме ... Все идет хорошо, но проблема в том, что даже я использую lstitem.ensurevisible с listitem.selected = истинной текущей записи не становится видимым.

11 ЛЕТ позже и все еще это не работает, и никто, даже Microsoft, похоже, не знает почему? Ответ, который работает для меня, - listview1.ensurevisible (itemindex) NOT listview.items (itemindex) .ensurevisible

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