Wpf 哪个负责在MVVM模式和DataGrid中对项目进行排序?

Wpf 哪个负责在MVVM模式和DataGrid中对项目进行排序?,wpf,c#-4.0,mvvm,datagrid,short,Wpf,C# 4.0,Mvvm,Datagrid,Short,我在wpf应用程序中有一个使用MVVM模式的dataGrid 如果我单击列名,dataGrid可以对行进行排序,如果我使用shift键,我可以按许多列排序。因此,控制提供了我所需要的一切 但是,我注意到,当我对行进行排序并添加新元素时,新元素实际上是作为视图模型中的可观察集合中的最后一个元素添加的,但是在dataGrid中,它根据排序标准显示在该元素所处的位置 因此,在视图模型中,我尝试选择新元素。我得到了我的observableCollection的最后一个元素的索引,但是这在DataGrid

我在wpf应用程序中有一个使用MVVM模式的dataGrid

如果我单击列名,dataGrid可以对行进行排序,如果我使用shift键,我可以按许多列排序。因此,控制提供了我所需要的一切

但是,我注意到,当我对行进行排序并添加新元素时,新元素实际上是作为视图模型中的可观察集合中的最后一个元素添加的,但是在dataGrid中,它根据排序标准显示在该元素所处的位置

因此,在视图模型中,我尝试选择新元素。我得到了我的observableCollection的最后一个元素的索引,但是这在DataGrid中选择了不正确的元素,显示了最后一个元素,但这不是我的新元素

一种解决方案似乎是使用CollectionViewSource,但如果我没有错的话,在这种情况下,我需要在视图模型中实现对元素进行排序的所有代码,当dataGrid执行此操作时,更多的代码也是如此

这让我不禁要问,究竟是哪一个真正有责任对元素进行排序?视图模型还是视图?因为如果在视图模型中实现排序,视图模型需要知道存在一个在某个列名中单击的datagrid,并对元素进行排序。我认为对元素进行排序是一种可视化的方式,因此视图模型不需要进行这种工作,但也许我错了


如何解决此问题?

当我将数据放入WPF中的任何采集控件(使用MVVM)时,我总是绑定到集合
ItemsSource
属性以及
SelectedItem
SelectedItems
属性,具体取决于控件的
SelectionMode

这使我能够找出选择了哪些项目,并从视图模型中选择想要选择的(数据)项目


如果用户在
DataGrid
中设置的顺序很重要,那么我将从视图模型执行排序,但是如果它只对用户工作时重要,那么您可以忽略顺序。。。请记住,您可以通过视图模型中的绑定
SelectedItem
属性访问所选项目。

是的,我使用SelectedItems与您一样工作,但在这种情况下,我希望在视图模型中选择项目,然后在数据网格中选择项目,以滚动所选项目。如果dataGrid中有许多行,我不希望用户滚动到所选项目,我希望这是自动的。我可以自动滚动,但是dataGrid中的所选项目与视图模型中的所选项目不同步。这是正确的方法。。。您可以使用
附加属性
自动滚动到所选项目,而不会丢失所选项目。如果你在网上搜索,有很多这样的例子。好吧,在我的例子中,我使用的行为,也许是相同的。但在特殊情况下,当我在dataGRid中进行排序时,我在视图模型集合中添加了一个新元素,dataGRid中的选定项与视图模型我的属性中的元素位置不同步。如果您希望这些项的顺序与它们在
dataGRid
中的显示顺序相同,尝试遍历只读
DataGrid.Items
属性。我没有尝试绑定到它,但它也是一个可绑定的属性,当然是
Mode=OneWay