【发布时间】:2015-02-10 15:30:09
【问题描述】:
我有一个带有两个ICollectionViews 的 ViewModel,它们作为ItemsSources 绑定到两个不同的ListBoxes。两者都包装相同的ObservableCollection,但使用不同的过滤器。最初一切正常,两个 ListBox 都显示正确填充。
但是,当我更改 ObservableCollection 中的项目并修改与过滤相关的属性时,列表框不会更新。在调试器中,我发现 ICollectionVIews 的 SourceCollection 都为空,尽管我的 ObservableCollection 仍然存在。
这是我修改项目的方式,以确保通过删除和添加相同的项目来更新 ICollectionView:
private void UnassignTag(TagViewModel tag)
{
TrackChangedTagOnCollectionViews(tag, t => t.IsAssigned = false);
}
private void TrackChangedTagOnCollectionViews(TagViewModel tag, Action<TagViewModel> changeTagAction)
{
_tags.Remove(tag);
changeTagAction.Invoke(tag);
_tags.Add(tag);
}
该机制在我使用相同类的另一个上下文中起作用。
我还意识到,如果我在 ICollectionViews 的 CollectionChanged 事件上注册侦听器,问题就会消失。我确保从 GUI 线程创建和修改它们,并怀疑垃圾收集是问题所在,但目前我被卡住了......想法?
更新:
在调试时,我意识到 SourceCollections 仍然存在,就在我在我的 UserControl 所在的 WinForms 窗体上调用 ShowDialog() 之前。当显示对话框时,它们就消失了。
我这样创建 ICollectionViews:
AvailableTags = new CollectionViewSource { Source = _tags }.View;
AssignedTags = new CollectionViewSource { Source = _tags }.View;
这是我绑定两者之一的方法(另一个非常相似):
<ListBox Grid.Column="0" ItemsSource="{Binding AvailableTags}" Style="{StaticResource ListBoxStyle}">
<ListBox.ItemTemplate>
<DataTemplate>
<Border Style="{StaticResource ListBoxItemBorderStyle}">
<DockPanel>
<Button DockPanel.Dock="Right" ToolTip="Assign" Style="{StaticResource IconButtonStyle}"
Command="{Binding Path=DataContext.AssignSelectedTagCommand, RelativeSource={RelativeSource AncestorType={x:Type tags:TagsListView}}}"
CommandParameter="{Binding}">
<Image Source="..."/>
</Button>
<TextBlock Text="{Binding Name}" Style="{StaticResource TagNameTextBlockStyle}"/>
</DockPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我在 ViewModel 中使用 MvvmLight 的 RelayCommand<T> 作为 ICommand 实现:
AssignSelectedTagCommand = new RelayCommand<TagViewModel>(AssignTag);
【问题讨论】:
-
请发布更多代码。
-
@Sinatr:我怀疑这与它有什么关系。项目上的 INotifyPropertyChanged 应该对过滤没有影响(正如我所写:它在不同的上下文中工作)。我得到了删除/添加的想法here。
-
@Ganesh:你能说得更具体点吗?我不知道要发布哪些代码而不会使帖子混乱。 ObservableCollection 不会在其他任何地方修改。 ICollectionView 也不是。
-
我想了解更多有关您的绑定的信息,您尝试在其中更新集合。
-
我对带有两个 TabItem 的 TabControl 有同样的问题。每个项目在同一视图模型中都有自己的 ICollectionView。最初 SourceCollection 已填充,但在加载第一个 TabItem 后,第二个 TabItem 的 ICollectionView 的 SourceCollection 为空。