如何在两个行数相等的DataGrids(以及隐藏的1-1映射字段)之间保持行的重复顺序

本文关键字:字段 隐藏 之间 映射 顺序 DataGrids 两个 | 更新日期: 2023-09-27 18:00:12

我有两个行数相同的DataGrids。每行上还有一个隐藏的整数字段/列,用于保持两者之间的1-1对应关系。当用户排序、选择或滚动时,一个DataGrid上的操作需要复制到另一个上。我最关心的是排序,因为我担心DataGrid的排序操作可能会干扰或无法反映我自己在幕后的排序。保持这些观点的最佳方式是什么?

(它适用于一个测量程序,其中一个网格有一个x、y、z坐标列表,而第二个列表有相同的点,并应用了变换。由于屏幕不可用,这些点被分为两个选项卡。)

如何在两个行数相等的DataGrids(以及隐藏的1-1映射字段)之间保持行的重复顺序

在大型数据集上,排序可能很昂贵。如果屏幕不动产是个问题,那么你可以有一个带有一种类型项目的数据网格,并切换项目模板以在两个视图之间切换。通过这种方式可以保留屏幕属性,排序不会重复两次,而且您有一种非常可靠的方法可以保持两个视图之间的排序同步。

有很多方法可以达到效果,最好的方法取决于具体情况。

一种方法是将两个不同的<GridView>设置为资源,并选择在代码中或通过与自定义转换器的绑定来使用哪一个:

<Grid>
    <Grid.Resources>
        <GridView x:Key="DefaultView">
             <GridViewColumn Width="120"....etc/>
        </GridView>
        <GridView x:Key="AlternativeView">
               <GridViewColumn Width="50"....etc/>
        </GridView>
    </Grid.Resources>
    <ListView x:Name="MyListView" ItemsSource="{Binding DisplayValues}" View="{StaticResource DefaultView}"/>
</Grid>

在后面的代码中,你可以切换视图,比如这样:

   MyListView.View = isDefault ? MyListView.TryFindResource("DefaultView") :  MyListView.TryFindResource("AlternativeView")

也可以使用绑定并跳过后面的代码。

另一种方法是为列项目之一制作用户控件,其中用户控件可以以两种可供选择的状态显示数据。

还有一种可能性是使用ItemTemplateSelector