Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在对datagrid的列重新排序后获得新的列顺序?_C#_.net_Wpf_Silverlight_Datagrid - Fatal编程技术网

C# 如何在对datagrid的列重新排序后获得新的列顺序?

C# 如何在对datagrid的列重新排序后获得新的列顺序?,c#,.net,wpf,silverlight,datagrid,C#,.net,Wpf,Silverlight,Datagrid,在数据网格中拖放一些列之后,如何以MVVM方式将新的顺序传递给Viewmodel 事件组非常奇怪 DataGrid_Reordered传递仅包含单个列的DataGridColumnEventArgs。我该拿它怎么办?我如何知道列的新顺序 很明显,列的顺序是由DisplayIndex决定的,但是我如何知道旧值是什么,新值是什么,以及这与整个列集合有什么关系呢 非常感谢,很好的问题:-)我猜您是在重新启动应用程序后对列顺序进行持久化 我不太喜欢网格,所以我没有任何具体的建议,但在我看来,您最终将在视

在数据网格中拖放一些列之后,如何以MVVM方式将新的顺序传递给Viewmodel

事件组非常奇怪

DataGrid_Reordered传递仅包含单个列的DataGridColumnEventArgs。我该拿它怎么办?我如何知道列的新顺序

很明显,列的顺序是由DisplayIndex决定的,但是我如何知道旧值是什么,新值是什么,以及这与整个列集合有什么关系呢

非常感谢,

很好的问题:-)我猜您是在重新启动应用程序后对列顺序进行持久化

我不太喜欢网格,所以我没有任何具体的建议,但在我看来,您最终将在视图模型(或新视图模型)中创建一组属性,这些属性对柱及其顺序进行建模

我想您必须关闭AutoGenerateColumns,在Xaml中定义所需的列,并在每个列的Header和DisplayIndex属性上使用双向绑定,以绑定到VM中的适当值

这样,您可以使用MVVM Light中的EventToCommand行为,将其绑定到网格的ColumnReordering事件和viewmodel中的RelayCommand。因为VM负责保持列的顺序,所以当事件触发时,您将拥有它


HTH

在我的页面中,我为数据网格设置了一个事件,用于加载
列displayedIndexChanged
。这对两者都很重要,我将在底部解释

<DataGrid x:Name="dataGrid"
              Loaded="dataGrid_Loaded" 
              ColumnDisplayIndexChanged="dataGrid_ColumnDisplayIndexChanged" 
              ItemsSource="{Binding modulecollection, 
                            Source={StaticResource viewmodel}}"/>
好的,您需要加载
中的事件来获取基线。这里,我的
DataGrid
从绑定源加载,因此我不会有列顺序的基线,除非在加载网格时捕获它

您需要
ColumnDisplayedIndexChanged
,因为您希望跟踪列顺序的更改

我发现了一件重要的事情,当用户将列移动到几行上时,
ColumnDisplayedIndexChanged
为移动到的每个索引激发。正如您在下面看到的,由于移动了一列,因此事件将针对其移动到的每个空间触发。
DataGridColumn
的Header对象也变为null。因此,如果您使用这种方法,请小心,您可能需要添加一些额外的处理。或者利用它来跟踪对变化的响应。示例:除非headervalue不为null,否则不要重新计算后台线程中的内容

原件:

A|B|C   <- Column Name
0|1|2   <- Column Index
用户移动一列,然后
ColumnDisplayedIndexChanged
事件如下所示:

第一项活动:

  null | B | C
  0    | 1 | 2
第二项活动:

  B  | null | C
  0  |  1   | 2
第三项活动:

  B | C | A
  0 | 1 | 2

也许这个答案对你有用
  B  | null | C
  0  |  1   | 2
  B | C | A
  0 | 1 | 2