Смущен насчет CollectionViewSource (SelectedItem не работает в комбо)

У меня есть несколько комбинаций, которые имеют одинаковый доступный выбор. Эти варианты представлены в коллекции, представленной в моей ViewModel. Все отлично и денди.

Теперь я хочу отсортировать эти варианты, поэтому я решилICollectionView из моей ViewModel вместо моего обычногоReadonlyObservableCollection<T>и сортировать представление коллекции в моей ViewModel.

<code>class EditStuffViewModel : ViewModelBase
{
    public EditStuffViewModel (ObservableCollection<Choice> choices)
    {
        Choices = new CollectionViewSource() { Source = choices }.View;
        Choices.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
    }

    public ICollectionView Choices
    {
        get;
        private set;
    }

    //snip other properties
}
</code>

Это все отлично работает, за исключением того, что сейчасall my combos now sync their selection.

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

Я попытался явно установитьIsSynchronizedWithCurrentItem="False" на моих комбо, которые успешно разъединяют их, но затем моя границаSelectedItem никогда не выбирается в комбинированном списке (вызывается связанный метод ViewModel, но результат никогда не выбирается). Выбор элемента, по-видимому, правильно обновляет мой установщик ViewModel.

Я, очевидно, упускаю что-то фундаментальное из того, как должен работать CollectionView. Кто-нибудь может просветить меня?

EDITМое плохое, этоDOES работать сIsSynchronizedWithCurrentItem="False", Смотрите мой ответ для деталей.

Приветствия.

 Dummy0106 апр. 2012 г., 13:08
В решении с IsSynchronizedWithCurrentItem = & quot; False & quot; Вы использовали INotifyPropertyChanged? OnPropertyChanged (& Quot; SelectedItem & Quot;)

Ответы на вопрос(2)

Я давно не трогал WPF, но думаю, что вам нужны другие экземплярыCollectionViewSource для каждого выпадающего списка для выбранного элемента.

Я думаю, это потому, чтоSelectedItem собственность связана сCollectionViewSource свойство состояния выбранного объекта (я предполагаю, чтоView у объекта есть), и ComboBox все совместно используют один и тот же исходный экземпляр, поэтому их выбранный элемент теперь синхронизируется.

Так что просто используйте разные экземплярыCollectionViewSource для каждого из ваших комбинированных списков. Вы все еще можете поделиться тем же выбором источника. Вам просто нужны разные виртуальные машины, так как ваши ComboBox должны вести себя отдельно друг от друга.

Примерно так (не проверено):

class EditStuffViewModel : ViewModelBase
{
    public EditStuffViewModel (ObservableCollection<Choice> choices)
    {
        ChoiceViews = new List<ICollectionView>();

        for (var i = 0; i < 10; i++) {
            var viewSource = new CollectionViewSource() { Source = choices };
            viewSource.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));

            ChoiceViews.Add(viewSource.View);
        }
    }

    public IList<ICollectionView> ChoiceViews
    {
        get; private set;
    }

    //snip other properties
}

Затем измените привязку ComboBox для привязки к элементуChoiceViews вместо.

 GazTheDestroyer06 апр. 2012 г., 12:42
Большое спасибо за пример кода, но просто невозможно отсортировать новый экземпляр для каждой комбинации. Количество комбинаций является динамическим, и их много. Я думаю, что мне нужно будет только один раз отсортировать коллекцию и раскрыть ее.
Решение Вопроса

Мне очень жаль, что я зря трачу время, но затоIsSynchronizedWithCurrentItem="False" работает. Я также добавил фильтр вместе с сортировкой, и выбранные по умолчанию значения не были в фильтрованном списке элементов. К сожалению.

Что касается ПОЧЕМУ мне нужно было явно отключить IsSynchronizedWithCurrentItem, когда я обычно не работаю со стандартными коллекциями, свет проливаетсяMSDN

true if the SelectedItem is always synchronized with the current item in the ItemCollection; false if the SelectedItem is never synchronized with the current item; Nothing if the SelectedItem is synchronized with the current item only if the Selector uses a CollectionView. The default value is Nothing.

Другими словами, если вы используетеCollectionView явно вместо использования представления по умолчанию в обычной коллекции, вы получаете синхронизацию выделения.

Ваш ответ на вопрос