WPF:Datagrid对绑定到同一集合的列表框进行排序

时间:2018-09-24 20:37:10

标签: wpf data-binding datagrid

我有两个WPF元素绑定到同一个ObservableCollection。一个是Datagrid,另一个是ListBox。当使用Datagrid对列进行排序时(使用内置的列标题),该操作会将列表框中的项目置于相同的顺序。换句话说,Datagrid中的排序动作似乎会影响基础集合的排序。有没有办法禁用此行为?

这是Datagrid的XAML:

                   <DataGrid 
                        IsReadOnly="True">
                        >
                        <DataGrid.Columns>
                            <DataGridTextColumn  
                                Binding="{Binding no}" >
                                <DataGridTextColumn.Header>
                                    <TextBlock>
                                    File<LineBreak/>No.
                                    </TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>

                            <DataGridTextColumn  
                                Header="Name" 
                                Binding="{Binding fileName}" />

                            <DataGridTextColumn Binding="{Binding channels}" >
                                <DataGridTextColumn.Header>
                                    <TextBlock TextAlignment="Center">
                                    Channels<LineBreak/>[#]
                                    </TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>

                        </DataGrid.Columns>
                    </DataGrid>

和列表框:

                    <ListBox 
                        SelectedIndex="{Binding fileListSelectedIndex}"
                        SelectedItem="{Binding fileListSelectedItem}"
                        >
                        <ListBox.Resources>
                            <DataTemplate DataType="{x:Type local:FileListItem}">
                                <TextBlock Text="{Binding Path=fileName}"/>
                            </DataTemplate>
                        </ListBox.Resources>
                    </ListBox>

最后,绑定代码:

        filelist.ItemsSource = vm.fileList;
        multiFileParamGrid.ItemsSource = vm.fileList;

1 个答案:

答案 0 :(得分:2)

ItemsSource在绑定到某些序列或集合时使用特殊的包装器类型(ICollectionView)。该包装器提供排序功能。默认包装对象是从CollectionViewSource.GetDefaultView方法获得的。当两个ItemsControl(DataGrid和ListBox)绑定到相同的集合(vm.fileList)时,它们(以及任何其他代码)将接收相同的包装对象。

但是有可能故意创建另一个包装实例:

filelist.ItemsSource = vm.fileList;
multiFileParamGrid.ItemsSource = new ListCollectionView(vm.fileList);