将View中的Sorted ListViewItems同步到ViewModel中的ObservableCollection

时间:2010-11-10 19:15:17

标签: c# wpf listview binding listviewitem

我在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,但是没有效果。

1 个答案:

答案 0 :(得分:2)

问题是(正如您自己所说),ViewModel中的某些逻辑和命令对元素的顺序很敏感。简而言之,他们不应该;如果原因实际上是重新排序项目(只是我能想象的唯一一个订单重要的位置),那么视图不应该按列排序。否则你需要找到使订单无关紧要的方法 - 或许你可以给出一个取决于项目顺序的动作的例子?这样我们就可以建议一个真正的解决方案。

还想澄清视图中项目的顺序与源ObservableCollection中的顺序无关。通常,ItemsControls会自动创建一个独立排序的ICollectionView。编辑:是的,不是一个真正的ICollectionView,它是一个更复杂的机制(ItemCollection与ItemContainerGenerator一起做的),但你得到了图片。