首页 > 解决方案 > WPF: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;

标签: wpfdata-bindingdatagrid

解决方案


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

但是可以故意创建一个不同的包装器实例:

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

推荐阅读