我在MVVM设计模式之后使用C#WPF。目前,我的视图的ListView
包含多个列和行(即ListViewItems
)。
ViewModel公开了View绑定的ObservableCollection<Person>
集合(如下所示)。
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>
在视图中,用户可以单击列标题,ListView
将相应地自行排序。问题是ViewModel中的一些逻辑和命令对元素的顺序很敏感,当ListView
在特定列上排序时,ViewModel中的基础People
集合不会反映用户看到的订单。
有关如何将ListViewItems
中已排序的ListView
与基础ObservableCollection<Person>
同步的任何线索?
编辑已经尝试过ListView ItemsSource上的Mode = TwoWay,但是没有效果。
答案 0 :(得分:2)
问题是(正如您自己所说),ViewModel中的某些逻辑和命令对元素的顺序很敏感。简而言之,他们不应该;如果原因实际上是重新排序项目(只是我能想象的唯一一个订单重要的位置),那么视图不应该按列排序。否则你需要找到使订单无关紧要的方法 - 或许你可以给出一个取决于项目顺序的动作的例子?这样我们就可以建议一个真正的解决方案。
还想澄清视图中项目的顺序与源ObservableCollection中的顺序无关。通常,ItemsControls会自动创建一个独立排序的ICollectionView。编辑:是的,不是一个真正的ICollectionView,它是一个更复杂的机制(ItemCollection与ItemContainerGenerator一起做的),但你得到了图片。