WPF开发ICollectionView出现意外过滤行为的问题排查求助
问题根因排查(按出现概率从高到低)
1. 集合实例重复引用(90%概率是这个)
你大概率在构造HeadingViewModel的时候,没有为每个Heading单独实例化Categories集合,所有Heading的Categories属性都指向了同一个ObservableCollection<CategoryViewModel>实例。最后给集合添加Category3的时候,相当于修改了所有Heading共享的这个集合,自然所有Heading下显示的都是最后一次修改后的内容。
修复方法:在每个HeadingViewModel的构造函数里独立初始化Categories集合:
public class HeadingViewModel { public ObservableCollection<CategoryViewModel> Categories { get; set; } public HeadingViewModel() { // 每个实例单独新建集合,不要共用全局/外部同一个集合实例 Categories = new ObservableCollection<CategoryViewModel>(); } }
构造Heading列表时也要每个单独赋值:
// 错误写法示例 var sharedCollection = new ObservableCollection<CategoryViewModel>(); var heading1 = new HeadingViewModel { Categories = sharedCollection }; sharedCollection.Add(new CategoryViewModel("Category1")); sharedCollection.Add(new CategoryViewModel("Category2")); var heading2 = new HeadingViewModel { Categories = sharedCollection }; sharedCollection.Clear(); sharedCollection.Add(new CategoryViewModel("Category3")); // 正确写法 var heading1 = new HeadingViewModel(); heading1.Categories.Add(new CategoryViewModel("Category1")); heading1.Categories.Add(new CategoryViewModel("Category2")); var heading2 = new HeadingViewModel(); heading2.Categories.Add(new CategoryViewModel("Category3"));
2. DataContext绑定错误
如果你的Heading列表用ItemsControl嵌套DataGrid,检查内层DataGrid的绑定路径是否写死了全局资源,或者绑定到了外层的DataContext而不是当前Heading的Categories。
正确的嵌套绑定示例:
<ItemsControl ItemsSource="{Binding HeadingList}"> <ItemsControl.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding HeadingName}"/> <!-- 这里的ItemsSource直接绑定当前数据上下文的Categories,不要加ElementName或者Source指向全局 --> <DataGrid ItemsSource="{Binding Categories}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding CategoryName}" Header="分类名称"/> </DataGrid.Columns> </DataGrid> </StackPanel> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>
3. ViewModel未实现INotifyPropertyChanged
如果HeadingViewModel的Categories属性是普通CLR属性,没有触发属性变更通知,前面的赋值被后面的覆盖后前端无法感知,不过这种情况一般是全空或者显示第一个赋值的内容,和你当前的现象吻合度不高,可以顺带排查。
内容的提问来源于stack exchange,提问作者rotormonkey
相关产品推荐
相关产品推荐

