CollectionViewSource CurrentItem - PullRequest
       6

CollectionViewSource CurrentItem

10 голосов
/ 27 февраля 2010

Я использую CollectionViewSource в модели диалогового представления, которая имеет различные требования к фильтрации, которая работает нормально. Я также поддерживаю эквивалент выбранного элемента в свойстве (SelectedProject), и мне интересно, смогу ли я / должен покончить с этим, так как представление будет знать текущий элемент. Моя привязка данных выглядит так:

<ListView  
      ItemsSource="{Binding Projects.View}" 
      IsSynchronizedWithCurrentItem="True"
      SelectedItem="{Binding SelectedProject, Mode=TwoWay}">

Я использую установщик для SelectedProject, чтобы упростить модульное тестирование, и, насколько я вижу, CurrentItem кажется не устанавливаемым. Мне также нужно привести его к нужному объекту, когда я хочу его использовать. OTOH, , если SelectedProject является избыточным, то я бы продемонстрировал его так же, как любую другую избыточность, и удалил бы его.

Итак, как вы обычно имеете дело с текущим элементом, когда используете CollectionViewSource?

Ответы [ 3 ]

7 голосов
/ 28 февраля 2010

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

CollectionViewSource.GetDefaultView(Projects.View).CurrentItem as Project

просто для взаимодействия с текущим проектом. Я ценю ясность над «встроенным». Кроме того, CurrentItem доступен только для чтения, поэтому, если вы захотите выбрать элемент в ViewModel, это будет невозможно.

1 голос
/ 19 сентября 2013

В моем случае я пытался установить SelectedItem в ListBox, чей ItemsSource был связан с CollectionViewSource. Это грязно, потому что вам действительно нужно установить текущий элемент на CollectionViewSource, а не ListBox.SelectedItem .... поэтому я создал метод Extension для обработки этого сценария для меня:

YourListBox.SetCurrentItemOnView<YourObjectType>(item);

... и определение метода расширения

public static void SetCurrentItemOnView<T>(this System.Windows.Controls.ListBox listBox, T item) where T : YourObjectType
{
    var view = listBox.ItemsSource as ListCollectionView;
    if (view == null) { return; }

    var itemToSelect = (from p in view.SourceCollection.OfType<T>()
                        where p.ID == item.ID
                        select p).FirstOrDefault();

    view.MoveCurrentTo(itemToSelect);
}

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

1 голос
/ 28 февраля 2010

Вы должны понимать, что SelectedItem из ListView не зависит от ItemsSource. Независимо от того, используете ли вы CollectionViewSource, List или Array, выбранный элемент всегда будет представлять элемент этой коллекции.

Итак, чтобы ответить на ваш вопрос о том, почему ваш SelectedProject не настраивается, я предлагаю вам проверить функциональность вашего установщика на наличие ошибок. Хороший способ выяснить, содержит ли привязка какие-либо ошибки, - проверить наш вывод на наличие сообщений об ошибках привязки во время отладки.

ПРИМЕЧАНИЕ. Если ваш SelectedProject того же типа, что и элементы в вашем Projects CollectionViewSource, вам не нужно приводить его перед использованием (если вы не сделали SelectedProject типа Object, тогда это также объясняет вашу проблему с настройками). *

РЕДАКТИРОВАТЬ: Извините, короткий ответ - нет, он не является избыточным. Наличие переменной, связанной с текущим элементом, не является избыточным, если вы планируете тестирование. Хороший пример - когда вы хотите протестировать старую версию SelectedItem с новой. Теперь, если вы ссылаетесь только на CollectionViewSource SelectedItem, сравнение может быть слишком поздним, но с вашей собственной переменной вы можете проверить логику, прежде чем устанавливать ее снова.

...