我有一堆都共享相同的可用选择的连击。 从我的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"
。 见我对细节的答案。
干杯。
我是在浪费大家的时间很遗憾,但设置IsSynchronizedWithCurrentItem="False"
不工作。 我也加入了筛选与排序一起,并且默认选择的值并不在项目的筛选列表。 哎呀。
至于为什么,我需要明确启用IsSynchronizedWithCurrentItem关闭时,我从来没有通常做标准的集合,光洒在MSDN
如果是的SelectedItem总是在ItemCollection当前项目真正的同步; 假的 ,如果是的SelectedItem从未与当前项目同步; 咱这的SelectedItem与仅在选择使用的CollectionView当前项目同步。 默认值是没有。
因此,换句话说,如果你使用CollectionView
明确,而不是使用一个普通集合的缺省视图,你选择的同步。
我没有带感动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
代替。