【问题标题】:WPF: Datagrid sorts Listbox bound to the same collectionWPF:Datagrid对绑定到同一集合的列表框进行排序
【发布时间】:2019-02-28 10:00:52
【问题描述】:

我有两个 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;

【问题讨论】:

    标签: wpf data-binding datagrid


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。这用一行代码解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    相关资源
    最近更新 更多