Datagrid列排序问题,排序看起来很好,但ItemSsource仍然是相同的

时间:2011-09-26 21:58:49

标签: c# wpf windows forms datagrid

以下是我如何定义DataGrid

                <toolkit:DataGrid 
                    Height="{Binding ElementName=parentCanvas, Path=ActualHeight}" 
                    Width="{Binding ElementName=parentCanvas, Path=ActualWidth}"
                    SelectionMode="Single" 
                    ScrollViewer.VerticalScrollBarVisibility="Auto"
                    SelectedIndex="{Binding CurrentSelectedIdx}" 
                    ItemsSource="{Binding Path=GameHostDataList, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                    AutoGenerateColumns="False" 
                    x:Name="gamehostsDataGrid" 
                    IsReadOnly="True" 
                    Visibility="{Binding Path=GhListVisibility}">
                    <toolkit:DataGrid.Columns>
                        <toolkit:DataGridTextColumn Binding="{Binding FacilityId}" Header="Facility ID" MinWidth="45" Width="45*" IsReadOnly="True" SortMemberPath="FacilityId"/>
                        <toolkit:DataGridTextColumn Binding="{Binding FacilityName}" Header="Facility Name" MinWidth="100" Width="110*" IsReadOnly="True" SortMemberPath="FacilityName"/>
                        <toolkit:DataGridTextColumn Binding="{Binding GameHostIp}" Header="GH IP" MinWidth="70" Width="75*" IsReadOnly="True" SortMemberPath="GameHostIp"/>
                        <toolkit:DataGridTextColumn Binding="{Binding Status}" Header="Status" MinWidth="80" Width="85*" IsReadOnly="True" SortMemberPath="Status"/>
                        <toolkit:DataGridTemplateColumn Header="" Width="Auto" MinWidth="24">
                            <toolkit:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Button Margin="0" HorizontalAlignment="Center" VerticalAlignment="Center" ToolTip="Delete"
                                        Command="{StaticResource deleteGhCommand}" Focusable="False"
                                        Width="24" Height="24">
                                        <Image Source="pack://application:,,,/DesktopShell;component/Resources/Buttons/Aha-Soft/No-entry.png" />
                                    </Button>
                                </DataTemplate>
                            </toolkit:DataGridTemplateColumn.CellTemplate>
                        </toolkit:DataGridTemplateColumn>
                    </toolkit:DataGrid.Columns>
                    <e:Interaction.Triggers>
                        <e:EventTrigger EventName ="SelectionChanged">
                            <b:CommandAction Command="{Binding DisplayGhCommand}"/>
                        </e:EventTrigger>
                    </e:Interaction.Triggers>
                </toolkit:DataGrid>

数据来源如下:

        ObservableCollectionEx<GamehostDataModel> gameHostDataList = new ObservableCollectionEx<GamehostDataModel>();

通过单击列标题对网格上的列进行排序后,条目看起来已排序,但是当我单击第一行时,显示与未排序列表对应的数据。我只是想知道itemsource的可视化表示与实际的itemsource数据之间的相关性是什么?

比如说:

Data Visually         Data Itemsource
2                     2
3                     3
1                     1

点击标题后我们有

Data Visually         Data Itemsource
1                     2
2                     3
3                     1

它是否应该重新排列参考数据源?

4 个答案:

答案 0 :(得分:1)

这对我来说听起来像个错误。 ItemsSource不应按网格排序。

答案 1 :(得分:1)

我对Toolkit DataGrid知之甚少,但如果它与WPF中的任何其他东西一样,它将不会对您的底层ItemsSource进行排序。 (怎么可能?你的ItemsSource可能是一个只读的IEnumerable。)相反,它会创建一个包装ItemsSource项的集合视图,集合视图是被排序的。集合视图是WPF支持排序和分组的方式。

如果您想获得对集合视图(包含已排序列表)的引用,请参阅“How to: Get the Default View of a Data Collection”。

答案 2 :(得分:0)

不,它不应该这样做,它可视化您的数据,只是假设您拥有庞大的数据源并在数据网格中可视化,并且每次在数据网格中对其进行排序时,它会重新排列您的数据源!你可以通过挂钩处理程序来做 顺便说一下,如果可以使用.NET 4.0,则不需要工具包,它将数据网格控件作为嵌入数据元素。

答案 3 :(得分:0)

我认为你真正的问题是获得正确的选定项目。所以请不要使用

 <DataGrid SelectedIndex="{Binding CurrentSelectedIdx}" 
      <e:Interaction.Triggers>
           <e:EventTrigger EventName ="SelectionChanged">
               <b:CommandAction Command="{Binding DisplayGhCommand}"/>
           </e:EventTrigger>
      </e:Interaction.Triggers>

你应该使用SelectedItem属性来获得你想要的东西。

 <DataGrid SelectedItem="{Binding MyViewModelSelectedItemProperty}" ...