-->

困惑CollectionViewSource(没有的SelectedItem在连击工作)(Confu

2019-07-28 20:08发布

我有一堆都共享相同的可用选择的连击。 从我的ViewModel露出一个集合中提供了这些选择。 所有罚款和花花公子。

我现在想这些选择排序,所以我决定揭露的ICollectionView从我的ViewModel,而不是我平时的ReadonlyObservableCollection<T>和排序在我的视图模型集合视图。

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
}

这一切工作正常,除了现在我所有的连击现在同步他们的选择

这不是我想要的。 我想分享的选择,但选择将其正常的绑定。 我想我明白,我的CollectionView被跟踪的选择,但我认为这是行为是选择在每个控制。

我曾尝试明确设置IsSynchronizedWithCurrentItem="False"在我的连击成功地去耦他们,但后来我绑定SelectedItem是从来没有在组合中选择(视图模型的绑定,调用getter时,但从未选择的结果)。 选择一个项目似乎正确地更新我的视图模型的制定者。

我显然失去了一些东西来的CollectionView是如何工作的基础。 任何人都可以告诉我吗?

编辑 :我的坏,这是否与工作IsSynchronizedWithCurrentItem="False" 。 见我对细节的答案。

干杯。

Answer 1:

我是在浪费大家的时间很遗憾,但设置IsSynchronizedWithCurrentItem="False"不工作。 我也加入了筛选与排序一起,并且默认选择的值并不在项目的筛选列表。 哎呀。

至于为什么,我需要明确启用IsSynchronizedWithCurrentItem关闭时,我从来没有通常做标准的集合,光洒在MSDN

如果是的SelectedItem总是在ItemCollection当前项目真正的同步; 假的 ,如果是的SelectedItem从未与当前项目同步; 咱这的SelectedItem与仅在选择使用的CollectionView当前项目同步。 默认值是没有。

因此,换句话说,如果你使用CollectionView明确,而不是使用一个普通集合的缺省视图,你选择的同步。



Answer 2:

我没有带感动WPF在一段时间,但我认为你需要的不同实例CollectionViewSource每个组合框维持选定的项目。

我想,这是因为SelectedItem属性被绑定到CollectionViewSource对象的选择项国有财产(我猜的View对象有它)和组合框都有着相同的源实例,因此他们选择的项目正在同步。

因此,只要使用的不同实例CollectionViewSource为每个组合框的。 您仍然可以共享相同的源选择。 你只需要不同虚拟机,因为你的组合框应该相互独立的行为。


事情是这样的(未经测试):

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
}

然后改变你的组合框结合绑定到的元素ChoiceViews代替。



文章来源: Confused about CollectionViewSource (SelectedItem not working in combos)