我有两个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;
答案 0 :(得分:2)
ItemsSource在绑定到某些序列或集合时使用特殊的包装器类型(ICollectionView
)。该包装器提供排序功能。默认包装对象是从CollectionViewSource.GetDefaultView
方法获得的。当两个ItemsControl(DataGrid和ListBox)绑定到相同的集合(vm.fileList
)时,它们(以及任何其他代码)将接收相同的包装对象。
但是有可能故意创建另一个包装实例:
filelist.ItemsSource = vm.fileList;
multiFileParamGrid.ItemsSource = new ListCollectionView(vm.fileList);