Синхронизируйте отсортированные ListViewItems в представлении с ObservableCollection во ViewModel - PullRequest
1 голос
/ 10 ноября 2010

Я использую C # WPF, следуя шаблону проектирования MVVM.В настоящее время мой вид имеет ListView, который содержит несколько столбцов и строк (то есть ListViewItems).

ViewModel предоставляет коллекцию ObservableCollection<Person> (как показано ниже), к которой привязывается View.

public ObservableCollection<Person> People
{
    get
    {
        return _people;
    }
    set
    {
        // new value?
        if( value != _people )
        {
            // Set
            _people = value;

            // Notify
            OnPropertyChanged( "People" );
        }
    }
}

, а здесь приведен фрагмент привязки

<ListView ItemsSource="{Binding People}" ... >
    <!-- Omitted -->
</ListView>

InПредставление, которое пользователь может щелкнуть по заголовку столбца, и ListView будет соответственно отсортировано.Проблема в том, что некоторые из логики и команд в ViewModel чувствительны к порядку элементов, и когда ListView сортируется по определенному столбцу, базовая коллекция People в ViewModel не отражает порядок, в котором находится пользователь.

Любая подсказка о том, как синхронизировать отсортированный ListViewItems в ListView с базовым ObservableCollection<Person>?

Редактировать Уже пробовал Mode = TwoWay onListView ItemsSource, который не работал.

1 Ответ

2 голосов
/ 10 ноября 2010

Проблема (как вы сами заявили) в том, что некоторые из логики и команд в ViewModel чувствительны к порядку элементов.Короче говоря, они не должны быть;если причина на самом деле заключается в переупорядочении элементов (почти единственное, что я могу себе представить, где порядок будет важен), то представление не должно сортироваться по столбцам.В противном случае вам нужно найти способы сделать заказ неактуальным - возможно, вы могли бы привести пример действия, которое зависит от порядка предметов?Таким образом, мы могли бы предложить реальное решение.

Также хотелось бы уточнить, что порядок элементов в представлении не имеет отношения к их порядку в исходной ObservableCollection.Обычно ItemsControls автоматически создает ICollectionView, который сортируется независимо.Изменить: да, ну, не фактический ICollectionView, это более сложный механизм (что ItemCollection делает в сочетании с ItemContainerGenerator), но вы получите картину.

...