wpf - 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;
解决方案
ItemsSourceICollectionView
在绑定到某个序列或集合时使用特殊的包装器类型 ( )。该包装器提供排序功能。默认的包装对象是从CollectionViewSource.GetDefaultView
方法中获得的。当两个 ItemsControl(DataGrid 和 ListBox)绑定到同一个集合 ( vm.fileList
) 时,它们(和任何其他代码)将接收相同的包装对象。
但是可以故意创建一个不同的包装器实例:
filelist.ItemsSource = vm.fileList;
multiFileParamGrid.ItemsSource = new ListCollectionView(vm.fileList);
推荐阅读
- php - 为什么我的 cookie 没有保留在 Laravel 中(使用 Homestead、Vagrant)?
- c - 在 C 中查找字符串的开头
- c++ - 实现私有类成员的重载构造函数
- html - 如何在 HTML 中创建正确间隔的表格的任意“部分”?
- python - 一种热编码与 pd.get_dummies 的 Pandas 更快方式
- spring - 创建名为“org.springframework.integration.internalMessagingAnnotationPostProcessor”的bean时出错
- r - data.table:根据指标列值和名称创建新的字符列
- c# - 获取 CarrouselView 中被点击的 Element 的索引
- ios - MKAnnotation 没有出现
- windows - Powershell:将指定目录中的所有文件放入单独的、唯一命名的子目录中